Разбор **kwargs

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

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

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

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

Дэн

1 ответ

Решение

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

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 будет пустой дикт, если не используются ключевые аргументы.

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

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

Другие вопросы по тегам