Python normale argumenter kontra søkeord argumenter

stemmer
224

Hvor er søkeord argumenter forskjellig fra vanlige argumenter? Kan ikke alle argumenter sendes som name=valuei stedet for å bruke posisjons syntaks?

Publisert på 13/09/2009 klokken 22:54
kilden bruker
På andre språk...                            


10 svar

stemmer
23

Det er to måter å tilordne argumentverdiene til funksjonsparametre, som begge er brukt.

  1. Etter posisjon. Posisjonelle argumenter ikke har søkeord og tildeles først.

  2. Etter nøkkelord. Søkeord argumenter har søkeord og er tildelt andre, etter posisjon argumenter.

Legg merke til at du har muligheten til å bruke posisjons argumenter.

Hvis du ikke bruker posisjon argumenter, så - ja - alt du skrev viser seg å være et nøkkelord argument.

Når du kaller en funksjon du gjør en beslutning om å bruke posisjon eller søkeord eller en blanding. Du kan velge å gjøre alle søkeord hvis du vil. Noen av oss ikke gjøre dette valget og bruke posisjons argumenter.

Svarte 13/09/2009 kl. 23:14
kilden bruker

stemmer
88

Ved hjelp av søkeord argumenter er det samme som vanlige argumenter bortsett fra for spiller ingen rolle. For eksempel de to funksjonene samtaler nedenfor er de samme:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)
Svarte 13/09/2009 kl. 23:17
kilden bruker

stemmer
36

posisjon Argumenter

De har ingen søkeord før dem. Rekkefølgen er viktig!

func(1,2,3, "foo")

Nøkkelordargumenter

De har søkeord i front. De kan være i hvilken som helst rekkefølge!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

Du bør også vite at hvis du bruker standard argumenter og unnlater å sette søkeordene, vil ordren da saken!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
Svarte 13/09/2009 kl. 23:17
kilden bruker

stemmer
11

Jeg er overrasket over at ingen har nevnt det faktum at du kan mikse posisjon og søkeord argumenter for å gjøre sleipe ting som dette å bruke *args, og **kwargs( fra dette nettstedet ):

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

Dette gjør det mulig å bruke vilkårlige søkeord argumenter som kan ha nøkler som du ikke ønsker å definere på forhånd.

Svarte 13/09/2009 kl. 23:52
kilden bruker

stemmer
155

Det er en siste språket funksjon der skillet er viktig. Vurdere følgende funksjon:

def foo(*positional, **keywords):
    print "Positional:", positional
    print "Keywords:", keywords

Det *positionalargumentet vil lagre alle posisjon argumenter som sendes til foo(), med ingen grense for hvor mange du kan gi.

>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

Det **keywordsargumentet vil lagre noen søkeord argumenter:

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

Og selvfølgelig kan du bruke begge samtidig:

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

Disse funksjonene brukes sjelden, men noen ganger de er svært nyttig, og det er viktig å vite hvilke argumenter er posisjons eller søkeord.

Svarte 13/09/2009 kl. 23:58
kilden bruker

stemmer
287

det er to beslektede begreper, begge kalt "søkeord argumenter".

På ringer side, som er det andre kommentarer har nevnt, har du muligheten til å angi noen funksjonsargumenter ved navn. Du må nevne dem etter alle argumentene uten navn (posisjonelle argumenter), og det må være standardverdier for noen parametere som ikke ble nevnt i det hele tatt.

Det andre konseptet er på funksjonsdefinisjonen side: Du kan definere en funksjon som tar parametere etter navn - og du trenger ikke engang å spesifisere hva disse navnene er. Dette er rene søkeord argumenter, og kan ikke sendes positionally. Syntaksen er

def my_function(arg1, arg2, **kwargs)

Eventuelle søkeord argumenter du passerer inn i denne funksjonen vil bli plassert i en ordbok som heter kwargs. Du kan undersøke nøklene til denne ordboken på kjøretid, som dette:

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}
Svarte 13/09/2009 kl. 23:58
kilden bruker

stemmer
19

Jeg er overrasket over at ingen ser ut til å ha påpekt at man kan passere en ordbok med tastet argument parametre, som tilfredsstiller de formelle parametre, som så.

>>> def func(a='a', b='b', c='c', **kwargs):
...    print 'a:%s, b:%s, c:%s' % (a, b, c)
... 
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>> 
Svarte 03/05/2013 kl. 22:07
kilden bruker

stemmer
12

Ved hjelp av Python 3 kan du ha både nødvendig og ikke-nødvendige søkeord argumenter :

Valgfritt : (standardverdi definert for 'b')

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

(ingen standardverdi definert for 'b'):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

Dette kan hjelpe i tilfeller der du har en mange lignende argumenter ved siden av hverandre, spesielt når av samme type, i så fall jeg foretrekker å bruke navngitte argumenter eller jeg lage en ny tilpasset klassen hvis argumentene hører sammen.

Svarte 06/04/2016 kl. 09:04
kilden bruker

stemmer
0

Jeg var på utkikk etter et eksempel som hadde standard kwargs bruker typen merknad:

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

eksempel:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}
Svarte 16/11/2018 kl. 17:16
kilden bruker

stemmer
0

Bare suplement / legge en måte for å definere standardverdien av argumenter som ikke er tildelt i stikkord når du ringer funksjonen:

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

kaller dette ved å:

print(func())
print(func(my_word='love'))

du vil få:

default_msg
love

Les mer om *argsog **kwargsi python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3

Svarte 08/09/2019 kl. 10:44
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more