python - shelve module does not work with "with" statement -


i'm trying use shelve module in python, , i'm trying combine "with" statement, when trying following error:

with shelve.open('shelve', 'c') shlv_file:     shlv_file['title']    = 'the main title of app'     shlv_file['datatype'] = 'data type int32'     shlv_file['content']  = 'lorem ipsum'     shlv_file['refs']     = '<htppsa: asda.com>'  print(shlv_file) 

the following error raised:

 shelve.open('shelve', 'c') shlv_file: attributeerror: dbfilenameshelf instance has no attribute '__exit__' 

although doing way:

shlv_file = shelve.open('data/shelve', 'c') shlv_file['title']    = 'the main title of app' shlv_file['datatype'] = 'data type int32' shlv_file['content']  = 'lorem ipsum' shlv_file['refs']     = '<htppsa: asda.com>' shlv_file.close()  shlv_file = shelve.open('data/shelve', 'c') shlv_file['new_filed'] = 'bla bla bla' print(shlv_file) 

no error raised, , output 1 expected. problem first syntax ? watching python course in instructor uses first version without problems.

you need understand purpose of with used for. used automatically handle setup , cleanup of objects called with, provided those objects support use of such setup , cleanup functions. in particular, object setup __enter__ function, , teardown equivalent __exit__ function. here's example:

in [355]: class foo():      ...:     def __enter__(self):      ...:         print("start!")      ...:         return self      ...:     def __exit__(self, type, value, traceback):      ...:         print("end!")      ...:          

and, instantiate object of foo with...as:

in [356]: foo() x:      ...:     print(x)      ...:      start! <__main__.foo object @ 0x1097f5da0> end! 

as see, with...as compulsorily call these setup/teardown methods, , if they're missing, attributeerror raised because attempt call non-existent instance method made.

it's same shelve object - doesn't have __exit__ method defined in class, using with not work.


according documentation, support context manager added version 3.4 , onwards. if context manager not work, mean version older.


Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -