这两个变量如何解压缩?

时间:2009-09-27 23:19:54

标签: python variables

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

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

我的问题来自“打开”。通常情况下,如果定义了两个变量,则会有一个逗号,然后会定义“已打开”的任何内容。不是这种情况。即使这个问题迫在眉睫,'open'等于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。

我想如果有人能解释这里发生的事情,我想要。

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

5 个答案:

答案 0 :(得分: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关键字参数没有什么特别或神奇之处;它只是改变了这个特定功能的行为。

答案 1 :(得分:2)

使用元组赋值,右侧不需要是显式元组:

x = 1, 0
a, b = x

做同样的事情:

a, b = 1, 0

如果函数返回一个元组,你可以用元组赋值解压缩它:

def my_fn():
    return 1, 0

a, b = my_fn()

答案 2 :(得分:2)

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

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

并检查resulttype(result)等:你会看到它是一个元组(可能是一个列表或其他序列,但不太可能),只有两个项目。 result[0]将是一个打开的文件,result[1]将是一个bool。最有可能的是,因为函数to_filehandle使用类似return thefile, thebool的语句编码,因为dcrosta也猜测。

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

fh, opened = result

并将两项序列解压缩为两个变量。通过直接解压缩,你只是“切断中间人”,我在这里命名为result的变量(为了让你更容易检查来自该函数调用的结果,在它被解压缩之前) 。如果您事先知道,您将始终获得一个2项序列,并且不需要这样的序列,而是每个项目都有一个单独的名称,那么您也可以一次解压并保存一个“中间步骤” - - 这就是它的全部!

答案 3 :(得分: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参数的处理方式不同。

答案 4 :(得分:0)

在Python中,函数具有多个返回值。在这种情况下,函数“cbook.to_filehandle”返回两个值。

关于错误,我想在我们知道'cbook.to_filehandle'想要做什么或看到代码之前,我们不能说太多。