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)
3 Réponses :
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!
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 -
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'])
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
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)
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.
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