где __enter__ и __exit__ определены для zipfile? - PullRequest
3 голосов
/ 10 октября 2011

На основе с оператором

  • Диспетчер контекста __exit__() загружается для дальнейшего использования.
  • Вызван метод менеджера контекста __enter__().

Я видел один из случаев использования с zipfile

Вопрос> Iпроверил исходный код zipfile, расположенный здесь:

/ usr / lib / python2.6 / zipfile.py

Я не знаю, где находятся функции __enter__ и __exit__определен?

Спасибо

Ответы [ 4 ]

9 голосов
/ 10 октября 2011

zipfile.ZipFile не является менеджером контекста в версии 2.6, он был добавлен в версии 2.7.

4 голосов
/ 10 октября 2011

Я добавил это как другой ответ, потому что это, как правило, не ответ на первоначальный вопрос. Однако это может помочь решить вашу проблему.

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 , введите и выйти . Вы можете добавить другие собственные функции, если хотите. Удачи!

2 голосов
/ 10 октября 2011

Пример создания класса с использованием класса объекта:

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

Надеюсь, я тебе помог.Я не проверял это, поэтому вам, возможно, придется улучшить его.

0 голосов
/ 10 октября 2011

кошка-плюс-плюс это правильно. Но если вы хотите, вы можете написать свой собственный класс, чтобы добавить «пропущенные» функции. Все, что вам нужно сделать, это добавить две функции в ваш класс (основанный на zipfile):

def __enter__(self):
  return(self)
def __exit__(self, exc_type, exc_val, exc_tb):
  self.close()

Этого должно быть достаточно, AFAIR.

...