Обратный вызов, как следует из названия, - это когда вы говорите некоторому коду (ftplib) перезвонить вам.Вы сами вызвали функцию ftpcallback
и передали ее возвращаемое значение (которое None
, потому что оно ничего не return
) методу storbinary
.
Вместо этого вы хотитетолько передавать объект функции при вызове storbinary
и позволить ftplib вызывать эту функцию для вас.Вы не хотите называть это сами.Следовательно, вам нужно избавиться от (...)
.
intid = self.intid
def ftpcallback():
ftpuploaded = transStatus[intid][3] + 8192 # transStatus[intid] equals 0 to start with
if ftpuploaded > transStatus[intid][2]:
ftpuploaded = transStatus[intid][2] # Is this needed? It's supposed to just keep the value below the file size
transStatus[intid][3] = ftpuploaded
print(transStatus[intid][3]) # Always outputs 8192
print("Callback called")
#FTP and file open code
self.ftp.storbinary("STOR " + self.destname, self.f, 1, ftpcallback)
. В документации по ftplib ничего не говорится об аргументах обратного вызова, поэтому я предполагаю, что она не передает никаких аргументов обратному вызову при его вызове.Поэтому ваш ftpcallback
должен быть вызван как ftpcallback()
, то есть без аргументов.Вот почему я удалил аргумент intid
и добавил intid = self.intid
перед функцией.
Другой способ сделать это - определить ftpcallback
как метод (def ftpcallback(self):
) вашего класса и передать self.ftpcallback
на storbinary
звонок.Тогда вы можете просто использовать self.intid
внутри метода.