Подтвердить что ты не робот

Определите, является ли переменная Python экземпляром встроенного типа

Мне нужно определить, является ли данная переменная Python экземпляром нативного типа: str, int, float, bool, list, dict и т.д. Есть ли элегантный способ сделать это?

Или это единственный способ:

if myvar in (str, int, float, bool):
    # do something
4b9b3361

Ответ 2

Не то, чтобы я знал, почему вы хотите это сделать, поскольку в Python нет никаких "простых" типов, все объекты. Но это работает:

type(theobject).__name__ in dir(__builtins__)

Но явно перечисление типов, вероятно, лучше, так как оно яснее. Или еще лучше: изменение приложения, поэтому вам не нужно знать разницу.

Обновление. Проблема, которая требует решения, заключается в том, как сделать сериализатор для объектов, даже встроенных. Лучший способ сделать это - не делать большой сериализатор phat, который обрабатывает встроенные функции по-разному, а искать сериализаторы на основе типа.

Что-то вроде этого:

def IntSerializer(theint):
    return str(theint)

def StringSerializer(thestring):
    return repr(thestring)

def MyOwnSerializer(value):
    return "whatever"

serializers = {
    int: IntSerializer,
    str: StringSerializer,
    mymodel.myclass: MyOwnSerializer,
}

def serialize(ob):
    try:
        return ob.serialize() #For objects that know they need to be serialized
    except AttributeError:
        # Look up the serializer amongst the serializer based on type.
        # Default to using "repr" (works for most builtins).
        return serializers.get(type(ob), repr)(ob)

Таким образом, вы можете легко добавлять новые сериализаторы, а код легко поддерживать и очищать, так как каждый тип имеет свой собственный сериализатор. Обратите внимание, что факт, что некоторые типы встроены, стал совершенно неуместным.:)

Ответ 3

Похоже, вы заинтересованы в том, чтобы simplejson будет обрабатывать ваши типы. Это делается тривиально

try:
    json.dumps( object )
except TypeError:
    print "Can't convert", object

Что более надежно, чем пытаться угадать, какие типы реализует ваша реализация JSON.

Ответ 4

Это старый вопрос, но, похоже, ни один из ответов не отвечает на конкретный вопрос: "(How-to) Определите, является ли переменная Python экземпляром встроенного типа". Обратите внимание, что это не "[...] для конкретного/заданного встроенного типа", а a.

Правильный способ определить, является ли данный объект экземпляром типа buil-type/class, заключается в том, чтобы проверить, не определяется ли тип объекта в модуле __builtin__.

def is_builtin_class_instance(obj):
    return obj.__class__.__module__ == '__builtin__'

Предупреждение: если obj - это класс, а не экземпляр, независимо от того, является ли этот класс встроенным или нет, True будет возвращен, поскольку класс также является объектом, экземпляр type (т.е. AnyClass.__class__ - type).

Ответ 5

Что такое "собственный тип" в Python? Пожалуйста, не основывайте свой код на типах, используйте Duck Typing.

Ответ 6

Встроенная функция типа может быть полезна:

>>> a = 5
>>> type(a)
<type 'int'>

Ответ 7

вы можете получить доступ ко всем этим типам с помощью модуля types:

`builtin_types = [ i for i in  types.__dict__.values() if isinstance(i, type)]`

в качестве напоминания, модуль импорта types first

def isBuiltinTypes(var):
    return type(var) in [i for i in  types.__dict__.values() if isinstance(i, type)] and not isinstance(var, types.InstanceType)

Ответ 8

построение ответа S.Lott, вы должны иметь что-то вроде этого:


from simplejson import JSONEncoder

class JSONEncodeAll(JSONEncoder):
  def default(self, obj):
    try:
      return JSONEncoder.default(self, obj)
    except TypeError:
      ## optionally
      # try:
      #   # you'd have to add this per object, but if an object wants to do something
      #   # special then it can do whatever it wants
      #   return obj.__json__()
      # except AttributeError:
      ##

      # ...do whatever you are doing now...
      # (which should be creating an object simplejson understands)

для использования:


>>> json = JSONEncodeAll()

>>> json.encode(myObject)
# whatever myObject looks like when it passes through your serialization code

эти вызовы будут использовать ваш специальный класс, и если simplejson может позаботиться об объекте, он будет. В противном случае ваша функциональность будет активирована и, возможно (в зависимости от использования дополнительной части), объект может определить ее собственную сериализацию

Ответ 9

Для меня лучший вариант:

allowed_modules = set(['numpy'])
def isprimitive(value):
  return not hasattr(value, '__dict__') or \
  value.__class__.__module__ in allowed_modules

Это исправление, когда значение является модулем, и value.__class__.__module__ == '__builtin__' не работает.