Какой питонный способ обрабатывать пустые * аргументы при создании набора? - PullRequest
4 голосов
/ 29 ноября 2010

Определение функции,

MyFunction (аргумент, * аргументы): [сделать что-то с аргументом [arg] для arg в * args]

если * args пусто, функция ничего не делает, но я хочу сделать поведение по умолчанию 'использовать весь набор, если длина * args == 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:

что, вероятно, будет работать, но не будет достаточно "питонным"?

это (есть) ли стандартный способ обращения к * 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)

Ответы [ 3 ]

4 голосов
/ 29 ноября 2010

Есть ли способ передать аргумент "весь набор" в 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 голос
/ 29 ноября 2010

Как насчет этого:

def MyFunc(argument, *args):
    ( DoSomething for i in (filter(args.__contains__ ,argument) if args else argument) )
0 голосов
/ 29 ноября 2010

Просто отметьте его not not, вам не нужно создавать отдельный аргумент

def test(*args):
    if not args:
        return #break out
    return True #or whatever you want
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...