变量赋值打印出输出

时间:2013-08-22 17:22:05

标签: python variable-assignment ftplib

好吧,当你在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 个答案:

答案 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)