2016-02-25 3 views
1

Я ищу более элегантный способ анализа kwargs. Я все еще влажный под ушами с Python, и это будет мое первое использование kwargs в def. Так вот сценарий:Parsing ** kwargs

def function(arg, arg, **kwargs) 
    other_function(arg, arg, **kwargs) 

def other_functions(arg, arg, **kwargs) 
    if kwargs: 
     name = etree.SubElement(params,'thing','value from kwargs') 
     return name 
    name = etree.SubElement(params,'thing') 
    return name 

Я чувствую, что есть лучший способ справиться с этим, чем при использовании, если се если есть ** kwargs. Это правильный способ сделать это?

Спасибо за помощь!

Dan

+1

Как насчет 'name = kwargs.get ('thing', None)' –

+2

Возможный дубликат [Правильный способ использования \ * \ * kwargs в Python] (http://stackoverflow.com/questions/1098549/proper -tw-use-kwargs-in-python) – IanAuld

+2

Примечание: 'kwargs' - это просто дикт и имеет все методы dict. – OozeMeister

ответ

2

То, что вы должны работать, но вы можете сделать это:

def other_function(parent, *args, **kwargs): 
    return etree.SubElement(parent, 'thing', attrib=kwargs) 

*args становится переменной args, который буквально только кортеж значений. Аналогично, **kwargs становится переменной kwargs, которая буквально просто является диктофоном.

SubElement имеет необязательный параметр attrib, который позволяет передавать в словаре значения, добавляемые в элемент как атрибуты XML. Таким образом, вы можете буквально передать значение kwargs.

Так, называя other_function как и произведет следующий вывод:

>>> print etree.tostring(other_function(parent, my_attrib='my value')) 
'<thing my_attrib="my value" />' 

И называя other_function без каких-либо ключевых аргументов слов, переданных в произведет следующий вывод:

>>> print etree.tostring(other_function(parent)) 
'<thing />' 

, как kwargs будет пустой dict, если аргументы ключевого слова не используются.

Примечание 1: с **kwargs позволяет передавать ничего, это позволяет создать что-нибудь в качестве атрибута на подэлементе который не может быть желаемым намерением, если любые из значений в kwargs должны быть использованы в других местах, например, флаги для функции.

Примечание 2: имена переменных args и kwargs - это просто конвенция. Вы можете использовать **atrib и передать attrib=attrib в SubElement, и он будет работать точно так же.

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