2017-09-11 43 views
8

Anahtar dizeleri Kabul tamsayılar ** kwargs ait anahtarları olarak

>>> def foo(**kwargs): 
...  pass 
... 
>>> foo(**{0:0}) 
TypeError: foo() keywords must be strings 

Ancak bazı kara büyü tarafından

olmak have to, ad atlamak mümkün olduğu

>>> from types import SimpleNamespace 
>>> SimpleNamespace(**{0:0}) 
namespace() 

Neden? Ve nasıl? kwargs eşlemesinde tamsayıları alabilen bir Python işlevi uygulayabilir misiniz?

+1

Daha önemli soru: neden gerekir? –

+2

Yani kısaca: anahtar kelime argümanlarını kabul eden ve kısıtlanmayan bir C-uzantısı türü tanımlayabilirsiniz. Ancak aynı şeyi yapan bir Python işlevi tanımlayamazsınız. –

+2

Başka bir python dağılımı aynı davranışı sergilediyse merak ediyorum ... –

cevap

6

Kwargs eşlemesinde tamsayıları alabilen bir Python işlevi uygulayabilir misiniz?

Hayır, yapamazsınız. Python değerlendirme döngüsü, Python kodunda tanımlanan arama işlevlerini, C kodunda tanımlanan bir çağrılabilir nesneyi çağırmaktan farklı şekilde işler. Anahtar kelime bağımsız değişkenini işleyen Python değerlendirme döngüsü kodu, dize olmayan anahtar kelime argümanlarındaki kapıyı sıkı bir şekilde kapatmıştır.

Ancak SimpleNamespace, bir Python tanımlı callable değil, entirely in C code olarak tanımlanmıştır. Herhangi bir doğrulama olmadan doğrudan anahtar kelime argümanlarını kabul eder, bu yüzden dize olmayan anahtar kelime argümanlarıyla bir sözlükte geçiş yapabilirsiniz.

Bu belki bir hatadır; Hepsi dizgi dışı anahtar kelime argümanlarına karşı korunan C-API argument parsing functions'u kullanmanız gerekir. Ancak SimpleNamespace sadece sys.implementation data* no'lu nesneler için tasarlanmıştı ve başka kullanımlar için tasarlanmamıştı.

Diğer istisnalar olabilir, ancak hepsi Python işlevleri değil, C tanımlı callables olacaktır.


* da SimpleNamespace sınıfının bir örneği çalışır time.get_clock_info() method; Bu, şu anda kullanılan tek diğer yerdir.