通过教程我了解到你可以在同一个语句中定义两个变量,例如:
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()
答案 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)
并检查result
,type(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
'想要做什么或看到代码之前,我们不能说太多。