2015-02-05 3 views
0

Хорошо, так что в основном у меня этот код работает, но я не знаю почему. Я использую ftplib и retrbinary. Вот фрагмент кода:Python: функции Lambda и callback?

def download(self): 

     if not self.f: 
      print("Can't download..... Not connected to a host") 
      return 
     FILE = self.handle_command("download") 
     if FILE: 
      #try: 
      self.f.retrbinary("RETR %s" % FILE, lambda block: self.handle_download(block, FILE), 1024) 
      print("Downloaded '%s' to cwd" % FILE) 
      #except: 
      # print("Can't download '%s'" % FILE) 

    def handle_download(self, block, filename): 
     open(filename, 'wb').write(block) 
     print(".") 

Мой вопрос: Почему в лямбда-функции в retrbinary я пишу «блок» после того, как лямбда (и перед двоеточием), но не «имя файла»?

В отличие от lambda: self.handle_download(block, FILE)

или ..... lambda block, filename: self.handle_download(block, FILE)

Надежда это ясно, спасибо

ответ

1

Второй аргумент ftplib.FTP.retrbinary() (так как я предполагаю, что self.f является ftplib.FTP) является вызываемым, который получает каждый полученный блок поочередно. Поскольку существует только один аргумент, и аргумент является принимаемым блоком, нецелесообразно использовать любую другую сигнатуру функции, и, следовательно, любые другие требуемые значения должны извлекаться из области видимости.

Смежные вопросы