Python 3.3 PEP 418示例给出'namespace'对象不可迭代的错误

时间:2012-07-10 17:08:57

标签: python namespaces python-3.x python-3.3

Python 3.3的测试结果非常出色。

新重新设计的time模块使用get_clock_info方法获取有关平台的许多逻辑时钟的信息。 PEP 418描述了新的时间模块。

当我尝试运行PEP 418 clock_resolution.py中引用的示例程序之一时,我在下面的第54行得到TypeError: 'namespace' object is not iterable

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) 

那么如何迭代命名空间对象呢?

1 个答案:

答案 0 :(得分: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的{​​{1}}实例成员变量中。

编辑:@DSM写了一条评论,显示了上述的替代方案。内置函数.__dict__将返回vars()成员变量,因此这相当于上面的内容:

.__dict__