我寫了一個python模塊:
b.py
class B:
pass
a.py
from b import B
class A:
def __init__(self):
self.member: B = B()
__init__.py
from ab_package.a import A
from ab_package.b import B
我使用極簡setup.py檔案通過 pip 打包并安裝它:
setup(
name='ab_package',
version='0.0.1',
description='My AB package',
url='https://github.com/somewhere',
author='Me',
author_email='[email protected]',
license='Private',
packages=['ab'],
install_requires=['numpy>=1.19.5',
'pandas>=1.3.3',
'pylint==2.11.1',
'pyparsing~=2.4.7',
'requests~=2.26.0',
'wget~=3.2',
],
classifiers=[
],
)
然后在另一個專案中,我使用它:
from ab_package import A, B
a = A()
myvar = a.member
問題是在 PyCharm 中,myvar被推斷為Any.
我可以通過型別提示明確修復它,myvar但這不夠簡潔(尤其是當我的型別比 長得多時B)。
我怎樣才能使推理按預期作業?
uj5u.com熱心網友回復:
在您顯示的示例代碼中,b具有型別的推理Any是更嚴重問題的征兆,您將AttributeError在嘗試a.b在賦值陳述句中查找時得到一個。型別檢查器mypy正確地將其識別為錯誤,如您在此處所見。我不確定 PyCharm 的內置型別檢查在這里可能有何不同,但我希望它也能識別錯誤。
如果您更改代碼以使B您在A.__init__屬性中創建實體,則代碼將起作用并且可以推斷型別,至少通過 mypy:
class B:
pass
class A:
def __init__(self):
self.b: B = B() # change member to self.b here
a = A()
b = a.b
reveal_type(b) # type checker reports __main__.B for me, should be ab_package.b.B for you
uj5u.com熱心網友回復:
正如@Blckknght所說,問題來自包中 Python 檔案之間的相對匯入。
如果我只是添加一個點到的進口b使得它from .b import B在a.py,則a.member有正確的推斷型別(以及myvar)。
a.py
from .b import B
class A:
def __init__(self):
self.member: B = B()
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/365145.html
