Как я могу сказать, какой тип данных находится внутри переменной Python? - PullRequest
1 голос
/ 15 июля 2010

У меня есть список переменных .. внутри списка есть строки, числа и объекты классов.Мне нужно выполнить логику на основе каждого типа данных.У меня возникают проблемы с обнаружением объектов класса и переходом логики в этой точке.

if(type(lists[listname][0]).__name__ == 'str'): # <--- this works for strings
elif(type(lists[listname][0]).__name__ == 'object'): <--- this does not work for classes

во второй строке кода выше, переменная name содержит "Address" в качестве имени класса.Я надеялся, что он будет содержать «класс» или «объект», чтобы я мог ветвить свою программу.В будущем у меня будет много разных типов объектов, поэтому немного непрактично выполнять логику для каждого имени класса, «Адреса», «Лица» и т. Д.

Пожалуйста, дайте мне знать, если мой вопрос нуждается в разъяснении.

спасибо !!

Ответы [ 4 ]

4 голосов
/ 15 июля 2010

К вашему сведению: это также имеет значение, если это новый класс или нет:

# python
type(1).__name__
'int'
type('1').__name__
'str'
class foo(object):
  pass
type(foo()).__name__
'foo'
class bar:
  pass
type(bar()).__name__
'instance'

Если вы можете быть уверены, что они все классы нового стиля, ваш метод определит реальный тип,Если вы сделаете их в старом стиле, они будут отображаться как «экземпляр».Не то чтобы я рекомендовал делать все в старом стиле только для этого.

Однако вы можете сделать еще один шаг вперед:

type(bar().__class__).__name__
'classobj'
type(foo().__class__).__name__
'type'

И всегда искать «classobj» илитип'.(Или имя метакласса, если он есть.)

2 голосов
/ 15 июля 2010

В Python принято использовать обработку исключений, чтобы решить, какой путь кода выбрать; проверка точного типа объекта (с помощью isinstance ()) для определения того, что с ним делать, не рекомендуется.

Например, скажем, что вы хотите, чтобы, если это строка, выведите ее в «case title», а если это объект, вы хотите вызвать для него определенный метод. Итак:

try:
    # is it an object with a particular method?
    lists[listname][0].particularMethod()
except AttributeError:
    # no, it doesn't have particularMethod(), 
    # so we expect it to be a string; print it in title case
    print lists[listname][0].title()
2 голосов
/ 15 июля 2010

Я думаю, вы хотите функцию isinstance.

if isinstance(o, ClassName):

Однако сначала вам нужно убедиться, что o - это объект, для этого можно использовать type.

0 голосов
/ 15 июля 2010

Если вас интересует только обработка двух типов, вы можете явно проверить их, используя isinstance, а затем обработать остатки:

import numbers

for item in list:
    if isinstance(item, basestring): # (str, unicode)
        do_string_thing(item)
    elif isinstance(item, numbers.Real): # (int, float, long)
        do_number_thing(item)
    else:
        do_object_thing(item)
...