2010-11-29 2 views
4

Определение функции,Что такое pythonic способ обрабатывать пустые * args при создании набора?

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

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

Вы пишете `Экспорт()` или `SubsetOutput()`? – 2010-11-29 05:10:11

+0

хорошо, обе. Экспорт - это «источник» для начала сопрограммы. Если функция экспорта вызывается с помощью * args, * args необходимо удалить из «источника» перед отправкой по трубе. – 2010-11-29 05:20:12

ответ

3

есть способ пройти «весь набор» аргумент 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]) 
0

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

def test(*args): 
    if not args: 
     return #break out 
    return True #or whatever you want 
1

Как об этом:

def MyFunc(argument, *args): 
    (DoSomething for i in (filter(args.__contains__ ,argument) if args else argument)) 
Смежные вопросы