首页 > 解决方案 > mypy:disallow_any_unimported 未按预期工作

问题描述

我正在向 python 3.7 中的现有项目添加类型注释。该项目使用 sqlalchemy,但我没有使用他们的存根,因为它们不完整。但是,我想在我的 ORM 类上注释属性,并且我希望 mypy 对所有这些强制注释。

这是一个最小的例子来说明我的意思:

测试.py:

from sqlalchemy import Column, Integer
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import as_declarative

@as_declarative
class Base:
    pass

class Foo(Base):
    __tablename__ = 'foo'

    oid = Column(Integer, primary_key=True)

mypy.ini:

[mypy]

[mypy-sqlalchemy.*]
ignore_missing_imports = True

[mypy-test]
disallow_any_unimported = True

有了这个,我期待 mypy 抱怨oid属性上缺少类型,然后我可以用oid: int = Column(...). 但我根本没有收到任何错误。

标签: pythonmypy

解决方案


好吧,看来我误解了disallow_any_unimported. 该标志基本上似乎涵盖了在注释中导入和使用未知类型的情况:

from untyped import Foo

# ...
x: Foo = bar

在我的情况下oid推断Any因为mypy不知道Column() 返回什么。

所以看起来我需要使用的标志是disallow_any_expr不允许Any在任何表达式中使用。

编辑:在我的原始示例(以及可能的其他内容)disallow_any_expr中也不允许使用的副作用。Integer即使文档说Any仍然允许在函数调用中使用,我本来希望扩展到构造函数。所以这个标志不是我问题的答案。但是,我找不到更细粒度的东西。


推荐阅读