2015-09-26 24 views
9

我有一個小類,這是如下:檢查如果一個變量屬於一類在python

class Gender(object): 
    MALE = 'M' 
    FEMALE = 'F' 

我有一個參數變量,它可以是僅中號˚F。爲了確保它只是,我做到以下幾點:

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

像上面的例子,我現在的參數是AL不過,因爲有50個州在美國,我不能實際使用的元組50級的變量,比如我用above.Is有這樣做的更好的辦法?我讀過isinstance,但它沒有給我預期的結果。

+2

如果你使用Python 3,看看[枚舉](HTTPS://docs.python。 org/dev/library/enum.html) –

+0

你應該使用[Enum](https://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python) – shx2

+0

和IIRC應該有一個用於枚舉的Python 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__

In [12]: "b" in vars(Foo).values() 
Out[12]: True 

__dict__物業用作namespace for classes等將返回在類的所有方法,magic methods和私有財產一樣,所以對於穩健性,你可能要修改您的搜索稍微補償。

在你的情況,你可能想使用一個classmethod,如:

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__'一起使用,更好的方法是使用'hasattr',但它不同於在類字典中查找,因爲它會看起來在繼承樹的每個地方。 –

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()',因爲'in'無論如何都要檢查密鑰。 '如果test_state不在狀態:'。 –

+1

你說得對 - 我只是習慣使用'.keys()'。 –

+1

如果使用'dict'構造函數,則可以使用關鍵字參數而不是創建字符串。例如'字典(AL ='阿拉巴馬',AK ='阿拉斯加')' –

5

我會建議使用枚舉定義既GenderStates
Enum如果Python 3上的標準庫的一部分。如果您在Python 2上使用enum34,請使用pip install enum34安裝。

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我將更新python 2.7的答案。 – Forge

+0

@Amistad現已更新。 – Forge

相關問題