Skip to main content
 首页 » 编程设计

python之这两个变量是如何解包的

2025年05月04日17kenshinobiy

通过教程我了解到您可以在同一语句中定义两个变量,例如:

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 

我的问题真的来自“打开”。好吧,通常如果定义了两个变量,就会有一个逗号,然后无论什么都会定义“打开”。不是这种情况。即使这个问题迫在眉睫,'opened' 等于 True,我认为这是因为 'return_opened = True。好吧,这很奇怪,因为我不记得在任何教程中都可以在变量前添加一个“return_”来影响该变量。

我又玩了一会儿,然后将 True 更改为 False,我明白了:

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 

所以我猜它只接受 False。

我想我希望有人能解释这里发生了什么。

谢谢 friend 们!

完整代码如下:

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() 

请您参考如下方法:

正如@dcrosta 所说,变量名并没有什么神奇之处。为了更好地了解发生了什么,请尝试:

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

并检查 result、type(result) 等:您会看到它是一个元组(可能是一个列表或其他序列,但不太可能)恰好有两个项目。 result[0] 将是一个打开的文件,result[1] 将是一个 bool 值。很可能,这是因为函数 to_filehandle 编码为类似 return thefile, thebool 的语句,正如 dcrosta 所推测的那样。

所以,这部分是“打包”——两个东西被打包到一个返回值中,使后者成为一个包含两个项目的元组。 “解包”部分是您稍后执行的操作:

fh, opened = result 

并且两项序列被解压缩为两个变量。通过直接进行解包,您只是在“切断中间人”,我在这里命名为 result 的变量(以便您更容易地检查函数调用的确切结果,在它之前被解压)。如果您事先知道您总是会得到一个包含 2 个项目的序列,并且不需要这样的序列,而是每个项目都有一个单独的名称,那么您最好立即解压并保存一个“中间步骤”- - 仅此而已!