2016-03-10 8 views
0

У меня есть функция:как разрешить args и kwargs, требуя один arg и kwarg; питон

def get_results(datasource, attribute='all_results', *args, **kwargs): 
    """gets results for basic datasource format""" 
    print(args, kwargs) 
    ds = datasource(*args, **kwargs) 
    ds.get() 
    results = getattr(ds, attribute) 
    return results 

называемый как

results = get_results(ThisDataSource, 'somestringID') 

давая арг/kwargs

(), {} 

Он работал в качестве

def get_results(datasource, *args, **kwargs): 
    """gets results for basic datasource format""" 
    print(args, kwargs) 
    ds = datasource(*args, **kwargs) 
    ds.get() 
    results = ds.all_results() 
    return results 

дает арг/kwargs

('somestringID',), {} 

Этот старый способ плох тем, что источник данных может потребоваться возвращать строки, столбцы и т.д. Он работал

results = get_results(ThisDataSource, 'somestringID') 

который вызвал

ds = ThisDataSource('somestringID') 

Как я могу дать его по умолчанию в декларации, но все же разрешить args и kwargs? Я хочу назвать

results = get_results(ThisDataSource, 'somestringID', attribute='rows') 

и имеют args = ('somestringID'), and retain access to атрибут = 'rows'`

Спасибо

+2

Вы не можете указать значение по умолчанию, а также аргумент быть частью 'kwargs'. 'kwargs' специально для аргументов, имена которых (не говоря уже о значениях по умолчанию) не указаны в сигнатуре аргумента. Это то, о чем вы спрашиваете? Пожалуйста, покажите пример того, как вы хотите вызвать функцию и какой результат вы хотите. – BrenBarn

ответ

2

Пусть сначала позиционное аргумент, чтобы быть атрибут.

def get_results(datasource, *args, **kwargs): 
     """gets results for basic datasource format""" 
     attribute = 'all_results' # default value 
     if 'attribute' in kwargs: 
      # attribure was given explicitly in keyword params 
      attribute = kwargs['attribute'] 
     else: 
      if len(args)>0: 
       # args contains at least 1 value - we suppose first value to be an attribute 
       # extract and remove it from args 
       attribute = args.pop(0) 
     print(attribute, args, kwargs) 
     ... 
+0

Это самый простой способ, я просто добавил docstring, чтобы объяснить странность. – codyc4321

+1

В этом случае вы можете добавить еще одну проверку - что kwargs не имеет атрибута. Pls смотрит на модифицированный код. –

+0

Я на самом деле поручил это ключевое слово arg, просто чтобы сделать его более ясным – codyc4321

 Смежные вопросы

  • Нет связанных вопросов^_^