特定の Python 変数がネイティブ型のインスタンスであるかどうかを判断する必要がstr
ありint
ます: 、、、、、float
など。それを行うエレガントな方法はありますか?bool
list
dict
または、これが唯一の方法ですか:
if myvar in (str, int, float, bool):
# do something
これは古い質問ですが、「(方法)Python変数が組み込み型のインスタンスであるかどうかを判断する」という特定の質問に実際に答えている回答はないようです。「[...]特定の/指定された組み込み型」ではなく、 .
特定のオブジェクトが組み込み型/クラスのインスタンスであるかどうかを判断する適切な方法は、オブジェクトの型がモジュールで定義されているかどうかを確認することです__builtin__
。
def is_builtin_class_instance(obj):
return obj.__class__.__module__ == '__builtin__'
警告:obj
がクラスでありインスタンスではない場合、そのクラスが組み込みであるかどうかに関係なく、クラスはオブジェクト、type
つまりAnyClass.__class__
isのインスタンスでもあるため、 True が返されますtype
。
Pythonには「単純な」型がなく、すべてオブジェクトであるため、なぜそれをしたいのかわかりません。しかし、これは機能します:
type(theobject).__name__ in dir(__builtins__)
ただし、タイプを明示的にリストする方が明確であるため、おそらく優れています。またはさらに良いこと: 違いを知る必要がないようにアプリケーションを変更します。
更新: 解決が必要な問題は、組み込みのオブジェクトであっても、オブジェクトのシリアライザーを作成する方法です。これを行う最善の方法は、ビルトインを異なる方法で処理する大きなファット シリアライザーを作成するのではなく、型に基づいてシリアライザーを検索することです。
このようなもの:
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)
このようにして、新しいシリアライザーを簡単に追加できます。また、各タイプに独自のシリアライザーがあるため、コードの保守と明確化が容易になります。一部の型が組み込みであるという事実がまったく無関係になったことに注目してください。:)
これを実現する最善の方法は、primitiveTypes
and と呼ばれるタプルのリストに型を収集することです。
if isinstance(myvar, primitiveTypes): ...
types
モジュールには、リスト/タプルの構築に役立つすべての重要な型のコレクションが含まれています。
あなたはsimplejsonがあなたのタイプを処理することを保証することに興味があるようです。これは簡単に行われます
try:
json.dumps( object )
except TypeError:
print "Can't convert", object
これは、JSON実装が処理するタイプを推測しようとするよりも信頼性があります。
Pythonの「ネイティブ型」とは何ですか? 型に基づいてコードを作成しないでください。Duck Typingを使用してください。
types
モジュールごとにこれらすべての型にアクセスできます。
`builtin_types = [ i for i in types.__dict__.values() if isinstance(i, type)]`
types
念のため、最初にモジュールをインポートします
def isBuiltinTypes(var):
return type(var) in types.__dict__.values() and not isinstance(var, types.InstanceType)
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 がオブジェクトを処理できる場合は処理します。そうしないと、キャッチオール機能がトリガーされ、(オプションの部分を使用するかどうかに応じて) オブジェクトが独自のシリアル化を定義できる可能性があります。
組み込み型関数が役立つ場合があります。
>>> a = 5
>>> type(a)
<type 'int'>