2

好吧,当你在 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目录相关的信息。

变量赋值如何产生输出?

4

4 回答 4

4

可能是因为函数包含一些打印语句,调用函数将始终执行该函数,即使返回值分配给某个变量。

例子:

>>> 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.
于 2013-08-22T17:24:33.650 回答
2

文档

FTP.retrlines(command[, callback])

...

回调函数会为每一行调用一个字符串参数,该字符串参数包含去除了尾随 CRLF 的行。默认回调将该行打印到 sys.stdout。

该函数正在打印输出。任务与它无关。

于 2013-08-22T17:26:48.707 回答
1

当你跑

a=ftp.retrlines('LIST')

您正在调用ftp.retrlines,该函数既返回一个值(存储在 中a),写入sys.stdout.

当你跑

a = 1

您只是在进行变量赋值,而进行变量赋值的机器不会写入sys.stdout.

于 2013-08-22T17:24:58.587 回答
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)
于 2013-08-22T17:35:24.283 回答