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

Я знаю , jsight уже упомянул это, но Aptana Studio действительно является великим, свободным редактором для JavaScript при находке большой работы с ним - это имеет большую поддержку большинства известных библиотек. Если бы не то, что я работаю с C# в дополнение к JavaScript, я использовал бы Aptana для всей моей работы.

21
задан icedwater 12 June 2013 в 07:19
поделиться

6 ответов

Лучший способ добиться этого - собрать типы в списке кортежей с именем primitiveTypes и:

if isinstance(myvar, primitiveTypes): ...

Модуль types ] содержит коллекции всех важных типов, которые могут помочь в построении списка / кортежа.

Работает с Python 2.2

15
ответ дан 29 November 2019 в 20:25
поделиться

Not that I know why you would want to do it, as there isn't any "simple" types in Python, it's all objects. But this works:

type(theobject).__name__ in dir(__builtins__)

But explicitly listing the types is probably better as it's clearer. Or even better: Changing the application so you don't need to know the difference.

Update: The problem that needs solving is how to make a serializer for objects, even those built-in. The best way to do this is not to make a big phat serializer that treats builtins differently, but to look up serializers based on type.

Something like this:

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)

This way you can easily add new serializers, and the code is easy to maintain and clear, as each type has its own serializer. Notice how the fact that some types are builtin became completely irrelevant. :)

8
ответ дан 29 November 2019 в 20:25
поделиться

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

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

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

7
ответ дан 29 November 2019 в 20:25
поделиться

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

2
ответ дан 29 November 2019 в 20:25
поделиться

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

>>> a = 5
>>> type(a)
<type 'int'>
1
ответ дан 29 November 2019 в 20:25
поделиться

основываясь на ответе С.Лотта, у вас должно быть что-то вроде этого:


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 может позаботиться об объекте, он будет . В противном случае сработает ваша общая функция,

0
ответ дан 29 November 2019 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: