在创建集合时,处理空 *args 的 Pythonic 方法是什么?
定义一个函数,
MyFunction(参数, *可变参数):
[对参数[每个可变参数]做一些操作]
如果*可变参数是空的,这个函数就什么都不做,但我想让默认行为是'如果*可变参数的长度为0,就使用整个集合'
def Export(source, target, *args, sep=','):
for item in source:
SubsetOutput(WriteFlatFile(target), args).send(item[0])
我不想在每次循环时都检查可变参数的长度,而且在循环开始之前我无法访问源中的项的键...
所以我可以这样做
if len(args) != 0:
for item in source:
else
for item in source:
这样做可能有效,但看起来不够“符合Python风格”?
有没有标准的方法来处理*可变参数或**关键字参数,当它们为空时的默认行为?
更多代码:
def __coroutine(func):
"""
a decorator for coroutines to automatically prime the routine
code and method from 'curous course on coroutines and concurrency'
by david beazley www.dabeaz.com
"""
def __start(*args, **kwargs):
cr = func(*args, **kwargs)
next(cr)
return cr
return __start
def Export(source, target, *args, sep=','):
if args:
for item in source:
SubsetOutput(WriteFlatFile(target, sep), args).send(item)
else:
for item in source:
WriteFlatFile(target, sep).send(item)
@__coroutine
def SubsetOutput(target, *args):
"""
take *args from the results and pass to target
TODO
----
raise exception when arg is not in result[0]
"""
while True:
result = (yield)
print([result.arg for arg in result.dict() if arg in args])
target.send([result.arg for arg in result.dict if arg in args])
@__coroutine
def WriteFlatFile(target, sep):
"""
take set of results to a flat file
TODO
----
"""
filehandler = open(target, 'a')
while True:
result = (yield)
line = (sep.join([str(result[var]) for
var in result.keys()])).format(result)+'\n'
filehandler.write(line)
3 个回答
1
这样怎么样:
def MyFunc(argument, *args):
( DoSomething for i in (filter(args.__contains__ ,argument) if args else argument) )
5
只需要检查一下它是不是空的,你不需要单独创建一个参数。
def test(*args):
if not args:
return #break out
return True #or whatever you want
5
有没有办法把一个“完整的集合”作为参数传给 SubsetOutput
,这样就可以把条件判断放在调用里面,而不是用一个明确的 if
?比如可以传 None
或者 []
。
# Pass None to use full subset.
def Export(source, target, *args, sep=','):
for item in source:
SubsetOutput(WriteFlatFile(target), args or None).send(item[0])
# Pass an empty list [] to use full subset. Even simpler.
def Export(source, target, *args, sep=','):
for item in source:
SubsetOutput(WriteFlatFile(target), args).send(item[0])
如果不行的话,我会选择用两个循环的办法,前提是这个循环真的只有一行代码。这样写起来比较顺畅,而且在一些小的代码重复使用上也是合理的。
def Export(source, target, *args, sep=','):
if args:
for item in source:
SubsetOutput(WriteFlatFile(target), args).send(item[0])
else:
for item in source:
FullOutput(WriteFlatFile(target)).send(item[0])