我的类在我的代码开始时可以调用,但不是在我的测试循环

时间:2016-05-27 08:42:18

标签: python class callable

我有2个文件:main.py和batsol.py

batsol.py包含一个类,而main.py正在从类Batsol创建一些实例。 所以我将向您展示我的代码的简洁版本......

class Batsol:
  def __init__(self, addressCan = None, name = None) :
    self.addressCan = addressCan
    self.name = name
    #other stuff ...

然后我的main.py:

from batsol import Batsol
# other import and code ...

print(callable(Batsol))
bs1 = Batsol()
# code...
if len(listener.ring_buffer) == 0 :
    for Batsol in tab_BS :
        try:
            print(tab_BS[Batsol])
        except (IndexError):
            pass
# code...
while(True) :
  # for and if interlocked
    print(callable(Batsol))
    bs2 = Batsol()

控制台显示:

True
False
Traceback (most recent call last):
File "./main.py", line 135, in <module>
bs2 = Batsol()
TypeError: 'int' object is not callable

跟踪的第二部分没有链接到我在我的代码中做的其他事情(线程没有正确终止......这样的事情),在我看来

Exception ignored in: <module 'threading' from '/usr/lib/python3.4/threading.py'>
Traceback (most recent call last):
File "/usr/lib/python3.4/threading.py", line 1292, in _shutdown
t = _pickSomeNonDaemonThread()
File "/usr/lib/python3.4/threading.py", line 1300, in _pickSomeNonDaemonThread
if not t.daemon and t.is_alive():
TypeError: 'bool' object is not callable

为什么我的对象在我的测试循环中不可调用? 它让我发疯了......

1 个答案:

答案 0 :(得分:0)

您的阴影发生在此代码片段中:

if len(listener.ring_buffer) == 0 :
    for Batsol in tab_BS :
        try:
            print(tab_BS[Batsol])
        except (IndexError):
            pass
time.sleep(4)
序列上的

for-in构造如下:

  1. 要求序列提供下一个(第一个,第二个,......最后一个)元素。内部指针跟踪当前迭代中的元素。
  2. 元素被分配到“in”左侧的名称。
  3. 转到1.
  4. 循环结束后,Batsol不再是您的类,而是来自tab_BS的最后一个元素。

    我建议使用更好的IDE,或使用良好的静态代码分析工具(Pylint / Flake8等),因为这种错误很容易通过例如PyCharm(您的代码外部范围的阴影名称)。

    相关:How bad is shadowing names defined in outer scopes?