什么是创建一个集合时处理空* args的pythonic方法?

问题描述 投票:4回答:3

定义一个函数,

MyFunction(参数,* args):[对* args中的arg参数[arg]做一些事情]

如果* args为空,则该函数不执行任何操作,但我想使默认行为'如果长度为* args == 0'则使用整个集合

def Export(source, target, *args, sep=','):
    for item in source:
        SubsetOutput(WriteFlatFile(target), args).send(item[0])

我不想在每次迭代时检查args的长度,并且在迭代开始之前我无法访问源中项的键...

所以,我可以

if len(args) != 0:
   for item in source:

else
   for item in source:

这可能会起作用,但似乎不够'pythonic'吗?

这是(有)标准方法来处理* args或** kwargs和默认行为,当其中任何一个是空的?

更多代码:

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)
python function arguments default function-signature
3个回答
4
投票

有没有办法将“整套”参数传递给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])

1
投票

这个怎么样:

def MyFunc(argument, *args):
    ( DoSomething for i in (filter(args.__contains__ ,argument) if args else argument) )

0
投票

只检查它不是没有,你不必创建一个单独的参数

def test(*args):
    if not args:
        return #break out
    return True #or whatever you want
© www.soinside.com 2019 - 2024. All rights reserved.