1
votes

python trop d'argument de mot-clé

Le code ci-dessous peut utiliser les mêmes données que l'entrée mais je dois utiliser ** _ pour éviter trop d'arguments. Existe-t-il un moyen de supprimer le paramètre ** _ et de saisir le paramètre correct dans f1 et 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)


2 commentaires

Pourquoi ne transmettez-vous pas les valeurs de champ respectives individuellement?


parce que je lis le script dans ma fonction et je combine pour formater comme list = (f1, db), (f2, db), (f3, db) .... (f100, db)] lorsque j'exécute le script f1 (** db ), f2 (** db) mais malheureux db est une variable lue à partir d'un script comme., freq = 2412, bw = 20 ... etc mais il y a une variable non lue à partir du script (par ex sys_path, log_path) donc créer un paramètre inutile dans db donc je dois utiliser ** _ pour attraper


3 Réponses :


0
votes

Si vous essayez de passer chaque clé individuellement, vous ne devriez pas avoir de problème, c'est-à-dire :

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

Bonne chance!


1 commentaires

Dans le cas réel, je souhaite que beaucoup de plaisir puisse utiliser la même entrée sera beaucoup plus simple, alors utilisez f1 (db ['freq'], db ['bw']) fonctionnera mais moins efficace si j'ai f1 ~ f100, je dois gérer cela 100 cas de diff -



2
votes

Toute méthode que vous essayez de pirater pour enregistrer des lignes de code serait illisible et entraînerait des bogues difficiles à retracer lorsque vos données dans db sont mal formées.

Faites-le la manière correcte, en étant explicite et non implicite . Appelez f1 et f2 comme ceci:

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

def f2(FW_ID):
    print(FW_ID)

Ou même simplement:

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


3 commentaires

Dans le cas réel, je souhaite que beaucoup de plaisir puisse utiliser la même entrée sera beaucoup plus simple


donc utilisez f1 (db ['freq'], db ['bw']) fonctionnera mais moins efficace si j'ai f1 ~ f100


J'ai besoin de gérer ce cas de 100 diff



0
votes

Peut-être avec un décorateur qui détecte les mauvais arguments?

2414 20
0.1

Sortie:

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)


3 commentaires

Je sais que vous voulez dire mais utiliser décorateur est presque comme si j'ajoute ** _ et diminuera les performances ...


Je pense que le meilleur moyen est d'utiliser Decorator, mais considérez les performances que je pense que l'utilisation de ** _ est la seule façon ...


@ 黃 瀚 嶙 Le décorateur pourrait être plus descriptif. Vous pouvez ajouter functools.wraps et les utilisateurs ne verront rien d'autre que les arguments valides lors de la lecture de la documentation de la fonction.