2

Python 3.3 的测试版已经发布,非常棒。

新改版的时间模块具有get_clock_info方法来获取有关平台的许多逻辑时钟的信息。PEP 418描述了新的时间模块。

当我尝试运行 PEP 418 中引用的示例程序之一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
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将尝试迭代某些内容以找到值(dict并且set是例外;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 回答