2009-09-27 53 views
1

通過教程,我已知道你可以在同一個語句定義兩個變量,例如:這兩個變量如何解包?

In [15]: a, b = 'hello', 'hi!' 

In [16]: a 
Out[16]: 'hello' 

In [17]: b 
Out[17]: 'hi!' 

以及如何應用到這裏?

fh, opened = cbook.to_filehandle(fname, 'w', return_opened = True) 

我打了招呼進一步:

In [18]: fh 
Out[18]: <open file 'attempt.csv', mode 'w' at 0xaac89d0> 

In [19]: opened 
Out[19]: True 

我的問題與 '開' 來真的。通常情況下,如果定義了兩個變量,就會有逗號,然後無論那裏會定義「已打開」。不是這種情況。即使這個問題迫在眉睫,「打開」等於True,我認爲是因爲'return_opened = True'。那太奇怪了,因爲我不記得在任何教程中,你可以在變量之前添加一個'return_'來影響該變量。

我用它玩多一些,我改變時真亦假,我得到這個:

In [10]: fh, opened = cbook.to_filehandle(fname, 'w', return_opened = False) 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

/home/blahblahblah/Documents/Programming/EXERCISES/piece.py in <module>() 
----> 1 
     2 
     3 
     4 
     5 

IOError: [Errno 9] Bad file descriptor 

所以我想它只接受假。

我想我想如果有人能解釋這裏發生了什麼。

Gracias amigos!

這裏是整個代碼:

if missingd is None: 
    missingd = dict() 

def with_mask(func): 
    def newfunc(val, mask, mval): 
     if mask: 
      return mval 
     else: 
      return func(val) 
    return newfunc 

formatd = get_formatd(r, formatd) 
funcs = [] 
for i, name in enumerate(r.dtype.names): 
    funcs.append(with_mask(csvformat_factory(formatd[name]).tostr)) 

fh, opened = cbook.to_filehandle(fname, 'w', return_opened=True) 
writer = csv.writer(fh, delimiter=delimiter) 
header = r.dtype.names 
writer.writerow(header) 

# Our list of specials for missing values 
mvals = [] 
for name in header: 
    mvals.append(missingd.get(name, missing)) 

ismasked = False 
if len(r): 
    row = r[0] 
    ismasked = hasattr(row, '_fieldmask') 

for row in r: 
    if ismasked: 
     row, rowmask = row.item(), row._fieldmask.item() 
    else: 
     rowmask = [False] * len(row) 
    writer.writerow([func(val, mask, mval) for func, val, mask, mval 
        in zip(funcs, row, rowmask, mvals)]) 
if opened: 
    fh.close() 

回答

2

正如@dcrosta所說,變量名沒有什麼神奇的。爲了更好地看到發生了什麼事情,請嘗試:

result = cbook.to_filehandle(fname, 'w', return_opened=True) 

,並檢查resulttype(result)等:你會看到它是一個元組(可以想象是一個列表或其他序列,但是這不太可能),正好用兩個項目。 result[0]將是一個開放文件,result[1]將是一個布爾值。最有可能的是,這是因爲功能to_filehandle編碼類似於return thefile, thebool的陳述,因爲dcrosta也推測。

所以,這部分是「包裝」 - 兩件事情被打包成一個返回值,使後者成爲一個包含兩項的元組。在「解包」的部分是當你後來做的事:

fh, opened = result 

和兩個項目序列解壓縮到兩個變量。通過直接進行解包,你只是「剪掉中間商」,我在這裏命名爲result的變量(爲了讓你更容易地檢查在函數調用解開之前究竟是什麼結果)。如果你事先知道,你總是會得到一個2項目的序列,不需要這樣的序列,而是每個項目都有一個單獨的名稱,那麼你可以立即解壓並保存一個「中間步驟」 - - 這裏的所有都是它的!

2

我的猜測是,該函數在內部看起來是這樣的:

def to_filehandle(filename, mode, return_opened=False): 
    # do something to open the file and set opened 
    # to True if it worked, False otherwise 
    if return_opened: 
     return the_filehandle, opened 
    else: 
     return the_filehandle 

沒有什麼特殊或魔法有關return_opened關鍵字參數;它只是改變這個特定功能的行爲。

0

在Python中,函數有多個返回值。在這種情況下,函數'cbook.to_filehandle'返回兩個值。

關於這個錯誤,我想我們不能透露更多信息,除非我們知道'cbook.to_filehandle'假設要做什麼或看到它的代碼。

2

隨着元組分配,右側並不需要是一個明確的元組:

x = 1, 0 
a, b = x 

做同樣的事情:

a, b = 1, 0 

如果一個函數返回一個元組,你可以使用元組賦值將它打包:

def my_fn(): 
    return 1, 0 

a, b = my_fn() 
1

拆包不是一個神奇的過程:每個元組(例如,(1, 2, 3)是具有三個值的元組)可以解壓縮爲三個值。但元組本身也是一種價值,這樣你就可以把它分配給一個變量或函數返回它:

x = (1, 2, 3) 
a, b, c = x 

# Or, for example : 
def function_returning_a_tuple(): 
    return (True, False) 

a, b = function_returning_a_tuple() 

正如你現在可以理解,cbook.to_filehandle只是返回兩個值(file, opened)的元組的功能。沒有什麼魔術背後,沒有任何關於return_something參數處理不同。

相關問題