Определите, является ли переменная Python экземпляром встроенного типа
Мне нужно определить, является ли данная переменная Python экземпляром нативного типа: str
, int
, float
, bool
, list
, dict
и т.д. Есть ли элегантный способ сделать это?
Или это единственный способ:
if myvar in (str, int, float, bool):
# do something
Ответы
Ответ 1
Лучший способ добиться этого - собрать типы в списке кортежей под названием primitiveTypes
и:
if isinstance(myvar, primitiveTypes): ...
Модуль types
содержит коллекции всех важных типов, которые могут помочь в создании списка/кортежа.
Работает с Python 2.2
Ответ 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__'
не работает.