Проверка, принадлежит ли переменная классу в python

у меня есть небольшой класс, который выглядит следующим образом :

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

у меня есть переменная параметра, которая может быть только M или 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'
    ....
....

как пример выше, мой параметр теперь АЛ.Однако, поскольку в США есть 50 штатов, я не могу практически использовать кортеж с 50 переменными как я использовал выше.Есть ли лучший способ сделать это ? Я читал об isinstance, но это не дало мне ожидаемых результатов.

3 ответов


можно использовать __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__ свойство используется как пространство имен для классов и так вернут все методы,магические методы и частная свойства в классе также, поэтому для надежности вы можете немного изменить свой поиск, чтобы компенсировать.

в вашем случае вы можете использовать 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

обновление Это явно ответ на вопрос OPs, но читатели также могут быть заинтересованы в Enum библиотека в Python 3, которая, вполне возможно, будет лучшим контейнером для таких данных.


почему вы не используете словарь? Его намного проще и поиск будет проще.

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

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

Я бы предложил использовать Enum для определения обоих Gender и States.
перечисление если часть стандартной библиотеки 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)