Python слишком много аргументов ключевого слова - PullRequest
1 голос
/ 29 октября 2019

Код ниже может использовать те же данные, что и входные данные, но мне нужно использовать ** _, чтобы избежать слишком большого количества аргументов. Есть ли способ удалить параметр ** _ и ввести правильный параметр для f1 и f2?

def f1(freq,bw,**_):
    print(freq,bw)
def f2(FW_ID,**_):
    print(FW_ID)
db = {
    'freq':2414,
    'bw':20,
    'FW_ID':0.1,
    }

f1(**db)
f2(**db)

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Любой метод, который вы попытаетесь взломать, чтобы сохранить строки кода, будет нечитаемым и приведет к ошибкам, которые трудно отследить, если ваши данные в db искажены.

Сделайте это правильноКстати, будучи явным, а не неявным . Вызовите f1 и f2 следующим образом:

f1(freq=db['freq'], bw=db['bw'])
f2(FW_ID=db['FW_ID'])

Или даже просто:

f1(db['freq'], db['bw'])
f2(db['FW_ID'])

Если вы сделаете это, вам не понадобится аргумент **_, и выможет написать более читаемую сигнатуру функции:

def f1(freq,bw):
    print(freq,bw)

def f2(FW_ID):
    print(FW_ID)

Альтернативой всему, что обе функции должны принимать полный db (dict) в качестве аргумента, и анализировать его внутри (но это можетбыть слишком повторяющимся)

0 голосов
/ 29 октября 2019

Может быть с декоратором, который ловит неверные аргументы?

import inspect

def catch_bad_args(func):
    def func_new(*args, **kwargs):
        argnames, _, _, _ = inspect.getargspec(func)
        kwargs = {k:v for k,v in kwargs.items() if k in argnames}
        return func(*args, **kwargs)

    return func_new

@catch_bad_args
def f1(freq, bw):
    print(freq, bw)

@catch_bad_args
def f2(FW_ID):
    print(FW_ID)

db = {
    'freq':2414,
    'bw':20,
    'FW_ID':0.1,
}

f1(**db)
f2(**db)

Вывод:

2414 20
0.1
0 голосов
/ 29 октября 2019

Если вы попытаетесь передать каждый ключ по отдельности, у вас не должно возникнуть проблем, а именно:

def f1(freq,bw):
    print(freq,bw)
def f2(FW_ID):
    print(FW_ID)
db = {
    'freq':2414,
    'bw':20,
    'FW_ID':0.1,
    }

f1(db['freq'], db['bw'])

2414 20

f2(db['FW_ID'])

0.1

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...