2013-08-22 128 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。

該功能正在打印輸出。這項任務與它無關。