2013-08-22 125 views
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目录中的信息。

变量赋值如何产生输出?

回答

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) 
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. 
1

当您运行时

a=ftp.retrlines('LIST') 

您正在呼叫ftp.retrlines,这是一个函数,它返回一个值(它被存储在a中),写入sys.stdout

当您运行

a = 1 

你只是在做变量赋值,这不变量赋值不会写入sys.stdout机械。

2

docs

FTP.retrlines(command[, callback])

...

回调函数被调用用含有与剥离尾部CRLF行字符串参数的每一行。默认回调会将行打印到sys.stdout。

该功能正在打印输出。这项任务与它无关。