为什么我得到 AttributeError?

Why I'm getting AttributeError?

我正在 python ( https://github.com/parthanium/YoPy ) 中使用 Yo api 进行申请,但出现了一个非常奇怪的错误。

因此,我已将存储库克隆到我的工作区中,并创建了以下文件 (test.py),当我 运行 'python test.py' 时,它按预期工作:

import yopy

token = "secret"
username = "testUser"
link = "https://github.com/parthanium/YoPy"

yo = yopy.Yo(token)
print yo
print yo.number()

现在的问题:

我有一个项目包含以前的项目(Yo api in python)作为 git 子模块:

yo/
├── README.md
├── gitmodules
│   └── yopy
│       ├── LICENSE
│       ├── README.md
│       └── yopy.py
└── yo.py

yo.py 文件具有以下内容:

import sys
sys.path.append("gitmodules/yopy")
import yopy
import struct

token = "secret"
username = "testUser"
link = "https://github.com/parthanium/YoPy"

yo = yopy.Yo(token)
print yo
print dir(yo)
print yo.number()

我在 运行ning:

时得到以下错误输出
<yopy.Yo object at 0x10cc29190>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_session', 'token', 'user', 'yo', 'yo_all']
Traceback (most recent call last):
  File "yo.py", line 13, in <module>
    print yo.number()
AttributeError: 'Yo' object has no attribute 'number'

为什么会出现此错误? dir(yo) 正在输出奇怪的属性,例如 'yo_all' 和 'yo'、'user'...

编辑: 尝试了 'print yopy.file',结果是 https://gist.github.com/pedrorijo91/4fb4defe7a7c2d8a2fdc(感谢@abarnert)

问题几乎可以肯定是您的 sys.path 中有其他名称为 yopy.pyyopy.pycyopy 的东西,很可能在当前工作目录中您正在尝试 运行 此来源。它可能是同一个库的旧版本,或者你编写的一些测试程序来测试这个库,或者一些不同的同名项目。

现在,您的 sys.path.append("gitmodules/yopy") 确实将正确的目录添加到导入程序搜索路径中 — 但它会将其添加到 end,而不是 start 。因此,如果有一个 ./yopy.py 和一个 ./gitmodules/yopy/yopy.py,它是 Python 将要导入的第一个。

您可以通过 print yopy.__file__ 查看导入的内容。或者,更好的是 import inspect 然后 print inspect.getsourcefile(yopy).

假设这是问题所在,解决方法是删除名称冲突的其他内容。 (你 可以 而只是将 sys.path.append(…) 更改为 sys.path.insert(0, …),但周围有其他 yopy 只会导致更多混乱......)