суббота, 3 ноября 2012 г.

Передача аргументов с неверным идентификатором (Перевод)


Я получил запрос на улучшение для hgapi, указывающий, что не возможно фильтровать логи Mercurial используя API, так как специального метода для этого нет, а запасной способ - указание именованных аргументов для дальнейшей передачи их в командную строку - не работает. Сам метод такой:
def hg_log(self, identifier=None, limit=None,
           template=None, branch=None, **kwargs):
где kwargs принимает ключи для передачи их командной строке. Таким образом, если мы хотим получить лог для ветки, то использование вызова
repo.hg_log(-b=mybranch)
должно бы сработать, пока Вы не заметите, что  '-b' некорректный идентификатор, так что код просто не будет работать. Но ведь почти все опции для работы с Mercurial, которые Вы можете захотеть передать, начинаются с -, так какой тогда смысл использовать kwargs вообще?
Примечание: То, что приведено дальше - плохой подход к коду!
И всё же возможно передать аргументы в функцию при помощи некорректного идентификатор, используя распаковку аргументов. Если взять функцию:
>>> def myfunc(positional, kwarg='Hello', **kwargs):
>>>     print(positional)
>>>     print(kwarg)
>>>     for key in kwargs:
>>>         print("%s: %s" % (key, kwargs[key]))
Вы можете передать любой словарь типа:
>>> myfunc(1, **{'-1-': 'dash-one-dash'})
1
Hello
-1-: dash-one-dash
Это, конечно, кривоватый способ, но он может быть полезен, например, в качестве запасного метода для поддержки аргументов, которые могут появиться в будущем, непонятных аргументов и вообще всего, что угодно.
(hgapi 1.3.1a3 был только что загружен на cheeseshop; hg_log теперь принимает аргумент 'branch')

Источник

Комментариев нет:

Отправить комментарий