У меня есть функция с 20-30 параметрами

def function (a,b,c,d,e,....):

     ....

Эти параметры могут иметь любое значение, включая «Нет».
Я хочу назначить конкретную строку для каждой переменной, которая имеет значение «Нет», прежде чем моя функция сделает свое дело.

Но я не хочу иметь огромный блок кода, такой как:

if a is None:
     ....
if b is None: ....

Как я могу просмотреть каждую переменную и назначить ее значение, если условие выполнено?

Ти

0
epattaro 24 Июн 2019 в 18:48

3 ответа

Лучший ответ

Если вы не делаете что-то довольно экзотическое, с такими вещами обычно лучше справиться, собирая переменные в структуре данных, например, dict примерно так:

def function(**kwargs):
    default = 42
    for key, val in kwargs.items():
        if val is None:
            kwargs[key] = default
    ...
    print(kwargs)

# Example call
function(a=1, b=None)

Вы можете назначать отдельные переменные, используя магию exec , но это вообще не рекомендуется. Кроме того, мне не ясно, как можно успешно использовать это внутри функции, например. exec('a = 42') фактически не меняет значение локальной a переменной.

2
jmd_dk 24 Июн 2019 в 16:02

Я не рекомендую делать это, но если вы настаиваете:

def function(a,b,c,d,e,...):
    myvars = locals()         # Get a dictionary of parameters
    arg_names = myvars.keys() # Get their names
    for k in arg_names:       # Replace the ones whose value is None
        if myvars[k] == None:
            myvars[k] = 'None'
0
Scott Hunter 24 Июн 2019 в 16:05

Если у вас так много аргументов функции, вы можете попробовать использовать итеративный оператор распаковки * вместо явного определения каждого аргумента. В этом вы будете иметь больше контроля над содержанием аргументов: -

def function(*args):
    args = list(args)
    for x, y in enumerate(args):
        if y is None:
            args[x] = "default_value"
    print(args)

Затем выполните вызов функции, подобный следующему:

function(123, 3, None, "hello")

< Сильный > ВЫВОД : -

[123, 3, 'default_value', 'hello']
1
Vasu Deo.S 24 Июн 2019 в 16:25