Normal bağımsız değişkenler ile anahtar kelime bağımsız değişkenleri


290

"Anahtar kelime bağımsız değişkenleri" normal bağımsız değişkenlerden nasıl farklıdır? Tüm argümanlar name=valuekonumsal sözdizimi kullanmak yerine iletilemez mi?



Ve varsayılan bir değer olup olmadığı onunla hiçbir ilgisi yoktur (bunun için bir değer geçirmeniz gerekip gerekmediği hariç), değil mi?
mk12


@Ben Hoyt Aşağıda Python 3, gerekli anahtar kelime argümanlarını kapsayan bir cevap eklendi
Christophe Roussy

Yanıtlar:


347

Her ikisi de " anahtar kelime bağımsız değişkenleri " olarak adlandırılan ilgili iki kavram vardır .

Arama tarafında, diğer yorumcuların bahsettiği şey, bazı işlev bağımsız değişkenlerini adıyla belirtebilirsiniz. Adsız argümanlardan ( konum bağımsız değişkenleri ) sonra bunlardan bahsetmelisiniz ve hiç belirtilmeyen parametreler için varsayılan değerler olmalıdır .

Diğer kavram işlev tanımı tarafındadır: parametreleri ada göre alan bir işlev tanımlayabilirsiniz - ve bu adların ne olduğunu belirtmeniz bile gerekmez. Bunlar saf anahtar kelime bağımsız değişkenleridir ve konumsal olarak iletilemez. Sözdizimi

def my_function(arg1, arg2, **kwargs)

Bu işleve ilettiğiniz tüm anahtar kelime bağımsız değişkenleri adlı bir sözlüğe yerleştirilir kwargs. Bu sözlüğün tuşlarını çalışma zamanında şu şekilde inceleyebilirsiniz:

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

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

{'a': 12, 'b': 'abc'}

5
+1 ve kabul edildi: Her iki konumsal + anahtar kelime argümanı hakkında konuşan tek kişi sizsiniz, herkes ya ilk ya da ikinciden bahsettiğimi düşündü (ama yine de iyi yayınlardı). Teşekkürler!
mk12

34
İfadeler net değil: Normalde, çağrılan taraftaki parametreler varken çağrı tarafındaki argümanlardan bahsedersiniz.
glglgl

3
Parametre adı olmalı mı kwargsyoksa sth olarak yeniden adlandırabilirim. gibi options( def my_fuction(arg1, arg2, **options))?
Bruce Sun

1
İsim kwargsdaha uygun bir isim olmadığında kongre olsa da
Matt Zimmerman

Burada açıklanan ikinci konsepte teknik olarak Keyfi Anahtar Kelime Argümanları denir.
Anshul Dahiya

188

Ayrımın önemli olduğu son bir dil özelliği var. Aşağıdaki işlevi göz önünde bulundurun:

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

*positionalArgüman geçirilen pozisyonel argümanlar tüm depolar foo()Verdiğiniz kaç hiçbir sınırı ile.

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

Bağımsız **keywordsdeğişken, anahtar kelime bağımsız değişkenlerini depolar:

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

Ve elbette, her ikisini aynı anda kullanabilirsiniz:

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

Bu özellikler nadiren kullanılır, ancak bazen çok kullanışlıdır ve hangi argümanların konumsal veya anahtar kelime olduğunu bilmek önemlidir.


3
Mükemmel cevap! Sadece gerekli konum bağımsız değişkenlerinin daha önce iletilebileceğini *positionalve **keywordsişlev tanımını değiştirirsek not edeceğimizi unutmayın def foo(arg1, *positional, **keywords):. İşte arg1konumsal ve gerekli. Yanıttaki konumun isteğe bağlı ve değişken sayıda konum argümanı anlamına geldiğini lütfen unutmayın.
shaffooo

2
Evet güzel cevap. Başka bir not: İşlevinizi çağırırsanız foo(bar=True), değerlerini bar = keywords.pop('bar')aynı ile alabilirsiniz bar = keywords.pop('bar', None). Varsayılan değer içinbar = keywords.pop('bar', False)
olibre

111

Anahtar kelime bağımsız değişkenlerini kullanmak, sıralamanın önemi dışında normal bağımsız değişkenlerle aynı şeydir. Örneğin, aşağıdaki iki işlev çağrısı aynıdır:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

3
Bunun için teşekkürler. Ben ki inanılmaz faydalı olduğunu hem bir pozisyonel arg gibi bir anahtar kelime arg belirtmek ve bir anahtar kelime arg olarak bir konumsal arg.
Luke Davis

47

Konumsal Bağımsız Değişkenler

Önlerinde hiç anahtar kelime yok. Sipariş önemlidir!

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

Anahtar Kelime Bağımsız Değişkenleri

Önlerinde anahtar kelimeler var. Herhangi bir sırada olabilirler!

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

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

Ayrıca, varsayılan bağımsız değişkenleri kullanır ve anahtar kelimeleri eklemek için ihmal ederseniz, siparişin önemli olacağını da bilmelisiniz!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

8
IMHO, 3. örnek (varsayılan bağımsız değişkenler) net değil. Bir veya daha fazla parametre varsayılan değerleri bildirdiğinde ve arama konum gösterimini kullandığında ne olduğunu konuştuğunuzu düşünüyorum, ancak bildirilen parametrelerin sayısından daha az LESS sağlıyor. Ancak, örneğinizin çağrıda 3 ve çağrıda 3 olduğu için varsayılan değerlerin hiçbir etkisi yoktur! Üçüncü argümanı atlamayı düşündünüz mü? örneğin func("bar", 5)? Ve sonra hellobunun varsayılan değerini aldığını söyleyin 3.
ToolmakerSteve

25

İşlev parametrelerine bağımsız değişken değerleri atamanın iki yolu vardır, her ikisi de kullanılır.

  1. Pozisyona göre. Konumsal bağımsız değişkenlerin anahtar sözcükleri yoktur ve önce atanır.

  2. Anahtar kelime ile. Anahtar kelime bağımsız değişkenleri anahtar kelimelere sahiptir ve konumsal bağımsız değişkenlerden sonra ikinci olarak atanır.

Not olduğunu sen pozisyonel argümanları kullanma seçeneğine sahip.

Eğer siz konumsal argümanları kullanmayın, daha sonra - evet - her şey sen bir anahtar kelime argüman olarak döner yazdım.

Ne zaman sen bir işlevi çağırmak Eğer kullanım pozisyonunda veya anahtar kelime veya bir karışıma bir karar. İsterseniz tüm anahtar kelimeleri yapmayı seçebilirsiniz. Bazılarımız bu seçimi yapmıyor ve konumsal argümanlar kullanmıyor.


1
Ne gerçekte olduğundan argümanlar (nedir ne zaman Ohh, parametrelerin düşünüyordum ben geçmesi). Teşekkürler!
mk12

24

Hiç kimsenin, bu gibi resmi parametreleri tatmin eden anahtarlı argüman parametreleri sözlüğü geçebileceğine işaret etmediğine şaşırdım.

>>> 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
>>> 

11
Yararlı bir teknik için +1. Demek istediğin, daha açık olurdu , **kwargs. Bu, sabit bir parametre sayısı olan basit bir fonk def'nin bile bir sözlük sağlanabileceğini gösterir. Yani, tanımda fantezi bir şey gerektirmez. Daha sonra, tanımla birlikte ** kwargs olan ikinci bir örnek ekleyebilir ve sözlükteki EKSTRA öğelerin bu yöntemle nasıl kullanılabileceğini gösterebilirsiniz.
ToolmakerSteve

1
Bunun çeşitli kütüphanelerin kaynak kodlarında olduğunu gördüm ve çok karıştı. Temizlediğiniz için teşekkürler!
Craig Labenz

3
Func 'a', 'b' ve 'c' dışında tuşlar içeren bir sözlükle çağırırsanız, dördüncü biçimsel parametre - ** kwargs gereklidir.
Eduardo

Benim için print 'a:%s, b:%s, c:%s' % (a, b, c)sözdizimi hatası veriyor, ancak print('a:%s, b:%s, c:%s' % (a, b, c))çalışıyor. Python sürümü ile ilgili bir şey mi var? Her neyse, bu anlayış için teşekkürler, şimdiye kadar daha hantal kullanıyordumprint('a:{}, b:{}, c:{}'.format(a, b, c))
Axel Bregnsbo

17

Kullanımı Python 3 sen olabilir hem zorunlu ve gerekli olmayan anahtar kelime argümanlar :


İsteğe bağlı : ('b' parametresi için varsayılan değer tanımlandı)

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

Gerekli ('b' parametresi için varsayılan değer tanımlanmadı):

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'`

Bu, özellikle aynı türdeyse, yan yana birçok benzer bağımsız değişkenin olduğu durumlarda yardımcı olabilir, bu durumda adlandırılmış bağımsız değişkenler kullanmayı tercih ederim veya bağımsız değişkenler bir aradaysa özel bir sınıf oluştururum.


3
Gerekli varyant oldukça yararlıdır. Varsayılanları sağlamadan argümanlara ad vermeyi ister, bu da çoğu zaman mantıklı değildir.
TNT

Varsayılan değerler hoş görünür ve başladığınızda zaman kazanmanıza yardımcı olabilir, ancak uzun vadede varsayılan değerler bir PITA olabilir.
Christophe Roussy

11

Kimse bu *argsve **kwargs( bu siteden ) kullanarak sinsi şeyler yapmak için konum ve anahtar kelime argümanları karıştırabilirsiniz gerçeğinden bahsetmedi şaşırdım :

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

Bu, önceden tanımlamak istemediğiniz anahtarlara sahip olabilecek rastgele anahtar kelime bağımsız değişkenlerini kullanmanızı sağlar.


0

Tip ek açıklama kullanarak varsayılan kwargs vardı bir örnek arıyordum:

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

misal:

>>> 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 {}

0

İşlevi çağırırken anahtar sözcüklerde atanmamış olan bağımsız değişkenlerin varsayılan değerini tanımlamak için bir yol ekleyin / ekleyin :

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

bunu şu adla ara:

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

alacaksınız:

default_msg
love

python hakkında *argsve **kwargspython hakkında daha fazla bilgi edinin : https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.