43

最近、Python でファイルから情報を保存して読み取ろうとしていたところ、ちょっとした問題に遭遇しました。テキスト ファイルから型情報を読み取ろうとしたのです。文字列から int または float への型キャストは非常に効率的ですが、文字列から型への型キャストは別の問題のようです。当然、私は次のようなことを試しました:

var_type = type('int')

ただし、typeキャストとしてではなく、実際にstrここにある変数の型を見つけるメカニズムとして使用されます。

私はそれを行う方法を見つけました:

var_type = eval('int')

evalしかし、私は通常、または可能な限り関数/ステートメントを避けようとしexecます。だから私の質問は次のとおりです:文字列を型にキャストする別のpythonic(およびより具体的な)方法はありますか?

4

4 に答える 4

56

locate組み込み型で機能するを使用するのが好きです。

>>> from pydoc import locate
>>> locate('int')
<type 'int'>
>>> t = locate('int')
>>> t('1')
1

...およびパスで検出できるもの:

>>> locate('datetime.date')
<type 'datetime.date'>
>>> d = locate('datetime.date')
>>> d(2015, 4, 23)
datetime.date(2015, 4, 23)

...カスタムタイプを含む:

>>> locate('mypackage.model.base.BaseModel')
<class 'mypackage.model.base.BaseModel'>
>>> m = locate('mypackage.model.base.BaseModel')
>>> m()
<mypackage.model.base.BaseModel object at 0x1099f6c10>
于 2015-04-23T18:29:29.457 に答える
15

あなたは何をしようとしているのか少し混乱しています。クラスとも呼ばれる型は、Python の他のすべてのものと同様にオブジェクトです。プログラムを作成するときは、たまたまクラスであるintと呼ばれるグローバル変数を参照しています。intあなたがやろうとしているのは、「文字列を型にキャストする」ことではなく、組み込み変数に名前でアクセスすることです。

それを理解すれば、解決策は簡単にわかります。

def get_builtin(name):
    return getattr(__builtins__, name)

本当に型名を型オブジェクトに変換したい場合は、次のようにします。私dequeは、再帰なしで幅優先のツリートラバーサルを実行していました。

def gettype(name):
    from collections import deque
    # q is short for "queue", here
    q = deque([object])
    while q:
        t = q.popleft()
        if t.__name__ == name:
            return t
        else:
            print 'not', t

        try:
            # Keep looking!
            q.extend(t.__subclasses__())
        except TypeError:
            # type.__subclasses__ needs an argument, for whatever reason.
            if t is type:
                continue
            else:
                raise
    else:
        raise ValueError('No such type: %r' % name)
于 2012-08-02T16:19:03.743 に答える
9

ルックアップテーブルを使用しないのはなぜですか?

known_types = {
    'int': int,
    'float': float,
    'str': str
    # etc
}

var_type = known_types['int']
于 2012-08-02T15:58:51.447 に答える
5

おそらくこれはあなたが望むものです、それは組み込み型のみを調べます:

def gettype(name):
    t = getattr(__builtins__, name)
    if isinstance(t, type):
        return t
    raise ValueError(name)
于 2012-08-02T11:04:40.317 に答える