2

Python 3.3のベータ版がリリースされ、すばらしいものになりました。

新しく作り直されたタイムモジュールには、プラットフォームの多くの論理クロックに関する情報を取得するためのget_clock_infoメソッドがあります。PEP 418は、新しい時間モジュールについて説明しています。

PEP 418で参照されているサンプルプログラムの1つであるclock_resolution.pyを実行しようとすると、TypeError: 'namespace' object is not iterable以下の54行目に表示されます。

46 clocks = ['clock', 'perf_counter', 'process_time']
47 if hasattr(time, 'monotonic'):
48     clocks.append('monotonic')
49 clocks.append('time')
50 for name in clocks:
51     func = getattr(time, name)
52     test_clock("%s()" % name, func)
53     info = time.get_clock_info(name)
54     if 'precision' in info:
55         print("- announced precision: %s" % format_duration(info['precision']))
56     print("- implementation: %s" % info['implementation'])
57     print("- resolution: %s" % format_duration(info['resolution']))

53行目の「info」には次のものが含まれています。

>>> info
namespace(adjustable=True, implementation='gettimeofday()', monotonic=False, resolution=1e-06) 

では、名前空間オブジェクトをどのように反復するのでしょうか。

4

1 に答える 1

4

オブジェクトを反復処理する必要はありません。属性の存在をテストしたいだけです。ふたつのやり方:

# "easier to get forgiveness than permission" approach
try:
    print(info.precision)
except AttributeError:
    pass

# "look before you leap" approach
if hasattr(info, "precision"):
    print(info.precision)

このinテストは、辞書、リスト、タプル、またはその他のシーケンスに何かがあるかどうかを確認するために使用されます。一般的なケースでinは、は値を見つけるために何かを反復しようとします(これdictset例外です。Pythonは効率のためにそれらを特殊なケースにしています)。しかしinfo、これは反復をサポートしないクラスのインスタンスです。

必要に応じて、次のようにすることができます。

# alternate "look before you leap"
if "precision" in info.__dict__:
    print(info.precision)

属性は実際には、dictという名前のインスタンスメンバー変数に格納されます.__dict__

編集:@DSMは、上記の代替案を示すコメントを書きました。組み込み関数はメンバー変数vars()を返す.__dict__ため、これは上記と同等です。

# nicer alternate "look before you leap"
if "precision" in vars(info):
    print(info.precision)
于 2012-07-10T17:24:21.807 に答える