好吧,当你在Python中为变量赋值时:
a = 1
什么都不见,没有打印出来。
但在这种情况下:
import ftplib
ftp = ftplib.FTP("igscb.jpl.nasa.gov")
ftp.login()
a=ftp.retrlines('LIST')
执行最后一行时,会打印出来:
d--X--X--X--X 2 0 0 4096 Nov 29 2001 bin
d--X--X--X--X 2 0 0 4096 Nov 29 2001 etc
这是与FTP目录相关的信息。
变量赋值如何产生输出?
答案 0 :(得分:4)
可能是因为该函数包含一些print语句,即使将返回值赋给某个变量,调用函数也会始终执行该函数。
示例:强>
>>> def func():
... print "hello world"
... return 'foo'
...
>>> a = func()
hello world
>>> a
'foo'
ftp.FTP.retrlines
上的帮助表示默认回调调用print_line
将数据打印到sys.stdout
。(从文档:默认回调将行打印到sys.stdout
)
>>> from ftplib import FTP
>>> print FTP.retrlines.__doc__
Retrieve data in line mode. A new port is created for you.
Args:
cmd: A RETR, LIST, NLST, or MLSD command.
callback: An optional single parameter callable that is called
for each line with the trailing CRLF stripped.
[default: **print_line()**]
Returns:
The response code.
答案 1 :(得分:2)
来自docs:
FTP.retrlines(command[, callback])
...
为每一行调用回调函数,其中包含一个字符串参数,该参数包含剥离尾部CRLF的行。默认回调将该行打印到sys.stdout。
该功能正在打印输出。作业与它无关。
答案 2 :(得分:1)
运行时
a=ftp.retrlines('LIST')
您正在调用ftp.retrlines
,这是一个函数,它返回一个值(存储在a
中),和写入sys.stdout
。< / p>
运行时
a = 1
您只是在进行变量赋值,执行变量赋值的机制不会写入sys.stdout
。
答案 3 :(得分:1)
请参阅源代码:http://hg.python.org/cpython/file/2.7/Lib/ftplib.py
418 def retrlines(self, cmd, callback = None):
419 """Retrieve data in line mode. A new port is created for you.
420
421 Args:
422 cmd: A RETR, LIST, NLST, or MLSD command.
423 callback: An optional single parameter callable that is called
424 for each line with the trailing CRLF stripped.
425 [default: print_line()]
426
427 Returns:
428 The response code.
429 """
430 if callback is None: callback = print_line
431 resp = self.sendcmd('TYPE A')
432 conn = self.transfercmd(cmd)
433 fp = conn.makefile('rb')
434 while 1:
435 line = fp.readline()
436 if self.debugging > 2: print '*retr*', repr(line)
437 if not line:
438 break
439 if line[-2:] == CRLF:
440 line = line[:-2]
441 elif line[-1:] == '\n':
442 line = line[:-1]
443 callback(line)
444 fp.close()
445 conn.close()
446 return self.voidresp()
正如其他答案所解释的那样,函数retrlines()
本身会进行打印到stdout
的调用。相关行是430,默认情况下,变量callback
被定义为函数print_line()
,毫不奇怪,它只是打印一个给定的字符串:
859 def print_line(line):
860 '''Default retrlines callback to print a line.'''
861 print line
在callback()
的第443行调用retrlines()
函数,导致打印该行。
要取消打印输出,您可以将retrlines()
与不执行任何操作的自定义callback
功能结合使用,例如
ftp.retrlines('LIST', callback=lambda x: pass)