2015-09-26 6 views
9

में एक वर्ग के अंतर्गत आता है, तो मैं एक छोटे से वर्ग है जो इस प्रकार है जाँच हो रही हैएक चर अजगर

>>> parameter = 'M' 
>>> if parameter not in (Gender.MALE, Gender.FEMALE) 
...  print "Invalid parameter" 
... 
Invalid parameter 
>>> 

अब मैं एक वर्ग है जो संयुक्त राज्य अमेरिका में सभी राज्यों में शामिल है इस प्रकार है:

ही नहीं, मैं तो निम्न कार्य करें है
class States(object): 
    ALABAMA = 'AL' 
    ALASKA = 'AK' 
    ARIZONA = 'AZ' 
    ARKANSAS = 'AR' 
    CALIFORNIA = 'CA' 
    COLORADO = 'CO' 
    CONNECTICUT = 'CT' 
    DELAWARE = 'DE' 
    DISTRICTOFCOLUMBIA = 'DC' 
    .... 
.... 

उदाहरण की तरह ऊपर, मेरे पैरामीटर अब अल .हालांकि, है के बाद से वहाँ संयुक्त राज्य अमेरिका में 50 राज्यों कर रहे हैं, मैं व्यावहारिक रूप से टपल 50 चर जैसे मैं above.Is वहाँ इस्तेमाल किया साथ ऐसा करने का एक बेहतर तरीका उपयोग नहीं कर सकते ? मैंने इंस्टीटेंस के बारे में पढ़ा लेकिन उसने मुझे अपेक्षित नतीजे नहीं दिए।

+2

आप अजगर 3 उपयोग कर रहे हैं द्वारा राज्यों में से एक है, पर [enum] (https एक नज़र डालें। org/dev/पुस्तकालय/enum.html) –

+0

आप एक [Enum] (https://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python) – shx2

+0

और IIRC का उपयोग करना चाहिए कहीं भी enums के लिए एक पायथन 2 नुस्खा होना चाहिए। –

उत्तर

8

आप __dict__ संपत्ति जो एक वर्ग तैयार करता, उदाहरण के लिए इस्तेमाल कर सकते हैं:

In [1]: class Foo(object): 
    ...:  bar = "b" 
    ...:  zulu = "z" 
    ...:  
In [2]: "bar" in Foo.__dict__ 
Out[2]: True 

या __dict__.values() का उपयोग आप मूल्यों के लिए खोज कर रहे हैं के रूप में:

In [3]: "b" in Foo.__dict__.values() 
Out[3]: True 

पीटर लकड़ी के रूप में

: बताते हैं, vars() में निर्मित भी __dict__ पुनः प्राप्त करने के लिए किया जा सकता 0
In [12]: "b" in vars(Foo).values() 
Out[12]: True 

__dict__ संपत्ति के रूप में अच्छी तरह से एक namespace for classes के रूप में प्रयोग किया जाता है और इसलिए वापस आ जाएगी सभी तरीकों, magic methods और वर्ग पर निजी संपत्तियों, तो मजबूती के लिए आप क्षतिपूर्ति करने के लिए थोड़ा अपनी खोज को संशोधित करने के लिए चाहते हो सकता है।

class States(object): 
    ALABAMA = "AL" 
    FLORIDA = "FL" 

    @classmethod 
    def is_state(cls, to_find): 
     print(vars(cls)) 
     states = [val for key, val in vars(cls).items() 
        if not key.startswith("__") 
        and isinstance(val, str)] 
     return to_find in states 

States.is_state("AL") # True 
States.is_state("FL") # True 
States.is_state("is_state") # False 
States.is_state("__module__") # False 
+1

में स्थिर चर का उपयोग करने के लिए जानकारी की तलाश कर रहा था सावधान रहें, यदि कुंजी से मेल खाने वाली कोई विधि है तो यह झूठी सकारात्मक वापसी करेगा। –

+0

मेरी कक्षा में कोई तरीका नहीं है, इसलिए यह पर्याप्त होना चाहिए .. धन्यवाद – Amistad

+0

ध्यान दें कि यह '__slots__' के साथ काम नहीं करेगा, 'हैशर' का उपयोग करने का एक बेहतर तरीका है, लेकिन यह क्लास डिक्शनरी में दिखने से अलग है जैसा कि यह दिखाई देगा विरासत पेड़ में हर जगह ऊपर। –

6

आप एक शब्दकोश का प्रयोग क्यों नहीं करते? यह बहुत आसान है और लुकअप भी आसान होगा।

states = {'AL': 'Alabama', 'AK': 'Alaska' ... } 
test_state = 'Foo' 

if test_state not in states.keys(): 
    print('{} is not valid input'.format(test_state)) 
+1

आप यहां तक ​​कि यहां तक ​​कि '.keys() 'का उपयोग करने की आवश्यकता है, क्योंकि कुंजी के खिलाफ' इन 'चेक के बाद भी। 'अगर test_state राज्यों में नहीं है:'। –

+1

आप सही हैं - मुझे सिर्फ '.keys() 'का उपयोग करने की आदत है। –

+1

यदि आप 'dict' कन्स्ट्रक्टर का उपयोग करते हैं तो आप स्ट्रिंग बनाने के बजाय कीवर्ड तर्क का उपयोग कर सकते हैं। जैसे 'dict (AL = 'Alabama', AK = 'अलास्का')' –

5

मैं Gender और States दोनों को परिभाषित करने के Enum उपयोग करने का सुझाव होगा:

आपके मामले में, आप इस तरह के रूप में एक classmethod उपयोग करने के लिए, चाहते हो सकता है।
EnumPython 3 पर मानक पुस्तकालय का हिस्सा है। यदि आप Python 2 पर enum34 पर हैं, तो pip install enum34 के साथ स्थापित करें। //docs.python:

from enum import Enum 
class States(Enum): 
    ALABAMA = 'AL' 
    ALASKA = 'AK' 
    ARIZONA = 'AZ' 
    ARKANSAS = 'AR' 
    CALIFORNIA = 'CA' 
    COLORADO = 'CO' 
    CONNECTICUT = 'CT' 
    DELAWARE = 'DE' 
    DISTRICTOFCOLUMBIA = 'DC' 
    ... 

तो फिर तुम देख सकते हैं कि एक चर

isinstance(variable, States) 
+1

यह बहुत अच्छा लग रहा है..कैसे भी..मैं अभी भी 2.7 .. – Amistad

+0

@Amistad I Python 2.7 के लिए उत्तर अपडेट करूँगा। – Forge

+0

@Amistad अब इसे अपडेट किया गया है। – Forge

संबंधित मुद्दे