32

特定の Python 変数がネイティブ型のインスタンスであるかどうかを判断する必要がstrありintます: 、、、、、floatなど。それを行うエレガントな方法はありますか?boollistdict

または、これが唯一の方法ですか:

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

11 に答える 11

25

これは古い質問ですが、「(方法)Python変数が組み込み型のインスタンスであるかどうかを判断する」という特定の質問に実際に答えている回答はないようです。「[...]特定の/指定された組み込み型」ではなく .

特定のオブジェクトが組み込み型/クラスのインスタンスであるかどうかを判断する適切な方法は、オブジェクトの型がモジュールで定義されているかどうかを確認することです__builtin__

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

警告:objがクラスでありインスタンスではない場合、そのクラスが組み込みであるかどうかに関係なく、クラスはオブジェクト、typeつまりAnyClass.__class__isのインスタンスでもあるため、 True が返されますtype

于 2013-07-22T18:52:30.317 に答える
11

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)

このようにして、新しいシリアライザーを簡単に追加できます。また、各タイプに独自のシリアライザーがあるため、コードの保守と明確化が容易になります。一部の型が組み込みであるという事実がまったく無関係になったことに注目してください。:)

于 2009-08-24T12:32:47.287 に答える
11

これを実現する最善の方法は、primitiveTypesand と呼ばれるタプルのリストに型を収集することです。

if isinstance(myvar, primitiveTypes): ...

typesモジュールには、リスト/タプルの構築に役立つすべての重要な型のコレクションが含まれています。

Python 2.2 以降で動作

于 2009-08-24T12:42:49.567 に答える
7

あなたはsimplejsonがあなたのタイプを処理することを保証することに興味があるようです。これは簡単に行われます

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

これは、JSON実装が処理するタイプを推測しようとするよりも信頼性があります。

于 2009-08-24T13:08:58.593 に答える
2

Pythonの「ネイティブ型」とは何ですか? 型に基づいてコードを作成しないでください。Duck Typingを使用してください。

于 2009-08-24T12:31:47.800 に答える
1

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)
于 2015-03-26T09:35:34.087 に答える
0

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 がオブジェクトを処理できる場合は処理します。そうしないと、キャッチオール機能がトリガーされ、(オプションの部分を使用するかどうかに応じて) オブジェクトが独自のシリアル化を定義できる可能性があります。

于 2009-08-24T23:00:24.940 に答える
0

組み込み型関数が役立つ場合があります。

>>> a = 5
>>> type(a)
<type 'int'>
于 2009-08-24T12:31:27.113 に答える