通过教程我了解到您可以在同一语句中定义两个变量,例如:
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 个项目的序列,并且不需要这样的序列,而是每个项目都有一个单独的名称,那么您最好立即解压并保存一个“中间步骤”- - 仅此而已!
