Eu nu înțeleg următorul exemplu, să spunem că am aceste funcții:
# python likes
def save(filename, data, **kwargs):
fo = openX(filename, "w", **kwargs) # <- #1
fo.write(data)
fo.close()
# python doesnt like
def save2(filename, data, **kwargs):
fo = openX(filename, "w", kwargs) # <- #2
fo.write(data)
fo.close()
def openX(filename, mode, **kwargs):
#doing something fancy and returning a file object
De ce este #1 soluția corectă și #2 unul greșit? **kwargs
este de fapt un dict, așa că, Dacă vreau să trec pe argument pentru a openX cred că în mod corect ar fi fara**
, și dându-dict. Dar python, evident, nu ca cel de-al doilea și-mi spune i-am dat 3 in loc de 2 argumente.
Deci, ce este motivul din spatele acestei?
În cel de-al doilea exemplu, ai la dispozitie 3 argumente: numele fișierului, modul și un dicționar (kwargs
). Dar Python se așteaptă: 2 argumente formale plus cheie argumente.
Prin prefixarea dicționar de '**' despachetați dicționar `kwargs la cuvinte cheie argumente.
Un dicționar (de tip dict`) este o singură variabilă care conțin perechi cheie-valoare.
"cuvinte Cheie de argumente" sunt cheie-valoare metoda de parametri.
Orice dicționar poate de despachetat la cheie argumente prin prefixarea cu **
in timpul apel de funcție.
La **
sintaxa spune Python pentru a colecta cuvinte cheie argumente într-un dicționar. Anii save2
trece-l în jos ca un non-cuvânt cheie argument (un dicționar obiect). Anii openX
nu vede orice cuvânt cheie argumente astfel **args
nu't te obișnuiești. L's de loc un al treilea non-cuvinte cheie argument (dicționar). Pentru a repara erorile de care modifica definiția de openX funcția.
def openX(filename, mode, kwargs):
pass
Pentru #2 args va fi doar un parametru formal cu dict valoare, dar nu un cuvânt cheie tip parametru.
Dacă vrei să treci un cuvânt cheie parametru de tip într-un cuvânt cheie argument Trebuie să specifice înainte de dicționar, ceea ce înseamnă args
verifica acest lucru pentru mai multe detalii privind utilizarea **kw
http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/
Extinderea pe @gecco 's a răspunde, următoarele este un exemplu care'll-ți arăt diferența: ``python def foo(**kwargs): pentru intrarea în kwargs.elemente(): de imprimare("Cheie: {}, valoare: {}".format(intrare[0], intrare[1]))
foo(a=1, b=2, c=3)
foo(**{"o": 1, "b":2, "c":3})
foo({"o": 1, "b": 2, "c": 3})
foo(3) foo("string")
``
Aici puteți vedea cum despachetarea un dicționar de lucrări, și de ce trimite un real dicționar eșuează
Declarația de mai sus este:
def model(caracteristici, target): global args regularizer = Nimic regularizsation_type = args.regularizastion_type.mai mici ...
Aceasta este o parte din cod unde suntem folosind regularizare abordări, L1 și L2, pentru a reduce în cele din urmă overfitting. I a lua eroare, "nici un modul numit args," după ce tastați "global args."