Где __enter__ и __exit__ определены для zipfile?
На основании заявления с
- Менеджер контекста
__exit__()
загружается для последующего использования. - Менеджер контекста
__enter__()
метод вызывается.
Я видел один из с использованием с zipfile
Вопрос> Я проверил исходный код zipfile, расположенный здесь:
/usr/lib/python2.6/zipfile.py
Я не знаю где __enter__
а также __exit__
функции определены?
Спасибо
4 ответа
Я добавил это как другой ответ, потому что это вообще не ответ на начальный вопрос. Тем не менее, это может помочь решить вашу проблему.
class MyZipFile(zipfile.ZipFile): # Create class based on zipfile.ZipFile
def __init__(file, mode='r'): # Initial part of our module
zipfile.ZipFile.__init__(file, mode) # Create ZipFile object
def __enter__(self): # On entering...
return(self) # Return object created in __init__ part
def __exit__(self, exc_type, exc_val, exc_tb): # On exiting...
self.close() # Use close method of zipfile.ZipFile
Использование:
with MyZipFile('new.zip', 'w') as tempzip: # Use content manager of MyZipFile
tempzip.write('sbdtools.py') # Write file to our archive
Если вы печатаете
help(MyZipFile)
Вы можете увидеть все методы оригинального zipfile.ZipFile и ваши собственные методы: init, enter и exit. Вы можете добавить другие собственные функции, если хотите. Удачи!
zipfile.ZipFile
не является контекстным менеджером в 2.6, это было добавлено в 2.7.
Пример создания класса с использованием класса объекта:
class ZipExtractor(object): # Create class that can only extract zip files
def __init__(self, path): # Initial part
import zipfile # Import old zipfile
self.Path = path # To make path available to all class
try: open(self.Path, 'rb') # To check whether file exists
except IOError: print('File doesn\'t exist') # Catch error and print it
else: # If file can be opened
with open(self.Path, 'rb') as temp:
self.Header = temp.read(4) # Read first 4 bytes
if self.Header != '\x50\x4B\x03\x04':
print('Your file is not a zip archive!')
else: self.ZipObject = zipfile.ZipFile(self.Path, 'r')
def __enter__(self): # On entering...
return(self) # Return object created in __init__ part
def __exit__(self, exc_type, exc_val, exc_tb): # On exiting...
self.close() # Use close method of our class
def SuperExtract(member=None, path=None):
'''Used to extract files from zip archive. If arg 'member'
was not set, extract all files. If path was set, extract file(s)
to selected folder.'''
print('Extracting ZIP archive %s' % self.Path) # Print path of zip
print('Archive has header %s' % self.Header) # Print header of zip
if filename=None:
self.ZipObject.extractall(path) # Extract all if member was not set
else:
self.ZipObject.extract(mamber, path) # Else extract selected file
def close(self): # To close our file
self.ZipObject.close()
Использование:
with ZipExtractor('/path/to/zip') as zfile:
zfile.SuperExtract('file') # Extract file to current dir
zfile.SuperExtract(None, path='/your/folder') # Extract all to selected dir
# another way
zfile = ZipExtractor('/path/to/zip')
zfile.SuperExtract('file')
zfile.close() # Don't forget that line to clear memory
Если вы запустите 'help(ZipExtractor)', вы увидите пять методов:
__init__, __enter__, __exit__, close, SuperExtract
Я надеюсь, что помог тебе. Я не проверял это, так что, возможно, вам придется улучшить его.
Кот -плюс-плюс это правильно. Но если вы хотите, вы можете написать свой собственный класс, чтобы добавить "пропущенные" функции. Все, что вам нужно сделать, это добавить две функции в ваш класс (который основан на zipfile):
def __enter__(self):
return(self)
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
Этого должно быть достаточно, AFAIR.