Управление дублирующимися аргументами ключевых слов - PullRequest
1 голос
/ 21 марта 2019

Я хочу создать метод уровня пользователя внутри класса, в котором аргументы могут передаваться через несколько вариантов ключевого слова.Для этого я настраивал список разрешенных вариантов для каждого аргумента ключевого слова и проверял каждое ключевое слово в каждом из этих списков.Например:

def some_function(self, **kwargs):
    """
    this function does something with a and b as keyword args
    """
    dict_allowed_a = ['a_variation1','a_variation2',...]
    dict_allowed_b = ['b_variation1','b_variation2',...]

    for arg_str in kwargs():
        if arg_str in dict_allowed_a:
            local_a = kwargs[arg_str]
        if arg_str in dict_allowed_b:
            local_b = kwargs[arg_str]
        else:
            print('Invalid keyword', file=sys.stderr)
            raise ValueError

return self._private_method(local_a, local_b)

У меня есть 3 вопроса, от более конкретного к менее конкретному:

  1. Как я могу проверить, прошел ли кто-то несколько вариантов одного аргумента, что должно вызватьисключение.
  2. Я делаю это правильно?
  3. Должен ли я делать это, пытаясь управлять переменными входами?

1 Ответ

1 голос
/ 21 марта 2019

Обратите внимание, что вам приходится сталкиваться со странными ситуациями, такими как

  1. . Пользователь указывает и a_variation1, и a_variation2
  2. . Пользователь не указывает ни одну из них.

Я бы использовал что-то вроде

local_a = ([kwargs[x] for x in kwargs.keys() if x in dict_allowed_a] + [None])[0]
local_b = ([kwargs[x] for x in kwargs.keys() if x in dict_allowed_b] + [None])[0]

Обратите внимание, что [0] будет извлекать только первое значение, это обрабатывает случай 1.

[None]это что-то вроде по умолчанию, оно используется в случае 2.

...