Python itertools计数器的当前值是什么

Car*_*arl 8 python python-itertools

itertools.countPython(2.7.9)中的计数器对于线程安全计数非常方便.我怎样才能获得计数器的当前值?

计数器递增并在每次调用时返回最后一个值next():

import itertools
x = itertools.count()
print x.next()  # 0
print x.next()  # 1
print x.next()  # 2
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

我没有办法在没有调用的情况下获得计数器的当前值next(),这会产生增加计数器或使用repr()函数的不良副作用.

继上述内容之后:

print repr(x)  # "count(3)"
Run Code Online (Sandbox Code Playgroud)

所以你可以解析输出repr().就像是

current_value = int(repr(x)[6:-1])
Run Code Online (Sandbox Code Playgroud)

会做的伎俩,但真的很难看.

有没有办法更直接地获得计数器的当前值?

Den*_*ach 12

在不推进迭代器的情况下获取下一个值的另一个技巧是滥用复制协议:

>>> c = itertools.count()
>>> c.__reduce__()[1][0]
0
>>> next(c)
0
>>> c.__reduce__()[1][0]
1
Run Code Online (Sandbox Code Playgroud)

或者只是从对象副本中获取它:

>>> from copy import copy
>>> next(copy(c))
1
Run Code Online (Sandbox Code Playgroud)


Łuk*_*ski 5

使用消息来源,卢克!

根据模块实现,这是不可能的。

typedef struct {
    PyObject_HEAD
    Py_ssize_t cnt;
    PyObject *long_cnt;
    PyObject *long_step;
} countobject;
Run Code Online (Sandbox Code Playgroud)

当前状态存储在cntlong_cnt成员中,并且它们都不在对象API中公开。__repr__正如您所建议的,只有可能被检索到的地方是object 。

请注意,在解析字符串时,您必须考虑非奇数增量的情况。repr(itertools.count(123, 4))等于'count(123, 4)'-在这种情况下,您所建议的逻辑将失败。