6

Pythonでの結果をtype()出力すると、現在のスコープにない型名が表示されることがあります。たとえば、次のコードが表示されます"<type 'frame'>"

import inspect
a = inspect.currentframe()
print( type( a ) )

しかしframe、現在のスコープにはタイプがありません! 対話型インタープリターで使用しようとすると、エラーが発生します。

>>> frame
NameError: name 'frame' is not defined

コードで参照できるように、「inspect.something.frame」のような「完全修飾」型名を取得する方法はありますか?

アップデート

残念ながら、__module__あまりにも機能していません:

>>> type( a ).__module__
'__builtin__'
4

3 に答える 3

2
"What's in a name? That which we call a frame 
 By any other name would smell as sweet."

フレームのタイプに対応する Python オブジェクトを探している場合は、次を使用できます。

In [38]: import types

In [39]: types.FrameType
Out[39]: <type 'frame'>

もちろん、これは別の書き方type(a)です:

In [42]: import inspect

In [43]: a = inspect.currentframe()

In [44]: types.FrameType == type(a)
Out[44]: True

モジュールの内部を見ると、次のように定義されているtypesことがわかります。types.FrameType

try:
    raise TypeError
except TypeError:
    tb = sys.exc_info()[2]
    TracebackType = type(tb)
    FrameType = type(tb.tb_frame)
    del tb

彼らがしているのは、 のインスタンスを見つけて、このインスタンスの であるframeと定義FrameTypeすることだけtypeです。

それは本質的にあなたが定義するときにあなたがしていることです

MyFrameType = type(a)

結論は、インスタンスの型を取得するには、単に を呼び出すだけtype(obj)です。他のことを事前に知る必要はありません。

于 2013-03-01T19:17:27.687 に答える
1

unutbu の回答には、ここでの特定の詳細がすべて含まれていますが、少し戻ってみましょう。

あなたがやろうとしていることは、一般的に不可能です。フレームだけでなく、にでも。

print(x)暗黙的に出力しstr(x)ます。運が良ければ、これは と同じですrepr(x)が、多くの場合、コンピューターで使用できるものではなく、人間が読み取れるものになります。

もちろん、repr(x)代わりに を使用するだけでそれを回避できstr(x)ます。しかし、それはまだ役に立ちません。

山かっこで囲まれた役に立たrepr(a)ないもの、または. しかし、それでも当てにはなりません。それは単なる経験則です。eval== a

<type 'frame'>そしてこの場合、 を取得すると、それは明らかに第 1 種の であり、役に立ちませんrepr

しかし、良いニュースがあります。あなたがする必要があるのは、周りにいて後で再構築しようとするxのではなく、周りにいることだけです。repr(x)x

または、この場合、type(a)周りにいて、フレームタイプがあります。

于 2013-03-01T19:42:43.047 に答える
1

これを行う簡単な方法はありません。通常、次のものを使用できます。

x.__module__ + '.' + x.__name__

ただし、モジュールからオブジェクトにアクセスできない場合、これは機能しません。たとえば、モジュールがdel名前空間からオブジェクトを削除するために使用する場合に、これが発生する可能性があります。

クラス メソッドについては、PEP 3155__qualname__で属性が導入されています。しかし、それもこの場合には役に立ちません。 type(a).__module__ですが'__builtin__'、モジュールframe内の名前ではありません。__builtin__これは、C で実装されている型ではかなり一般的です。

この場合、frame型がtypesモジュール内にあることを知っておく必要があります。

from types import FrameType as frame
于 2013-03-01T19:18:29.917 に答える