kwargs

2013-02-20 64 views
5

में काम करने के लिए गैर स्ट्रिंग कीवर्ड के साथ पास करें, मैं लाइब्रेरी के साथ काम करता हूं जिसमें हस्ताक्षर f(*args, **kwargs) के साथ काम करता है। मैं kwargs बहस में अजगर dict उत्तीर्ण करने की आवश्यकता है, लेकिन dict कीवर्डkwargs

f(**{1: 2, 3: 4}) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: f() keywords must be strings 

में नहीं तार शामिल मैं कैसे समारोह संपादन के बिना इस के आसपास मिल सकता है?

उत्तर

6

गैर-स्ट्रिंग कीवर्ड तर्कों की अनुमति नहीं है, इसलिए इस समस्या का कोई सामान्य समाधान नहीं है। अपने विशिष्ट उदाहरण तार करने के लिए अपने dict की कुंजी परिवर्तित द्वारा निर्धारित किया जा सकता है:

>>> kwargs = {1: 2, 3: 4} 
>>> f(**{str(k): v for k, v in kwargs.items()}) 
+1

मुझे लगता है कि यह सबसे अच्छा है जो वास्तव में किया जा सकता है। कीवर्ड तर्क तार होना चाहिए, इसलिए 'TypeError'। – Will

+2

@Will - मुझे लगता है कि सबसे अच्छा क्या वास्तव में आपके द्वारा गुज़रने वाले डिक्टियों पर निर्भर करता है। शब्दकोश 'डी = {' 1 ': 1, 1: 3}' पर विचार करें। – mgilson

+0

@mgilson: यह सही है। आपके उत्तर में +1। –

1

मुझे लगता है कि सबसे अच्छा आप कर सकते हैं अपने dict में गैर-स्ट्रिंग तर्क को फ़िल्टर है:

kwargs_new = {k:v for k,v in d.items() if isinstance(k,str)} 

कारण यह है कि कीवर्ड तर्क स्ट्रिंग होना चाहिए। अन्यथा, वे दूसरी तरफ क्या अनपॅक करेंगे?

वैकल्पिक रूप से, आप तार करने के लिए अपने गैर स्ट्रिंग कुंजी परिवर्तित कर सकते हैं, लेकिन आप को अधिलेखित चाबियों का खतरा:

kwargs_new = {str(k):v for k,v in d.items()} 

- पर विचार करें क्या होगा यदि आप के साथ शुरू किया:

d = { '1':1, 1:3 } 
+0

यह पायथन 3 है, इसलिए कोई 'बेसस्ट्रिंग' नहीं है। –

+0

@ लार्समैन - पर्याप्त मेला। मैंने टैग्स को बारीकी से नहीं देखा। – mgilson