在创建集合时,处理空 *args 的 Pythonic 方法是什么?

9 投票
3 回答
28782 浏览
提问于 2025-04-16 07:45

定义一个函数,

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

撰写回答