Mypy 将 ORM 不可为 null 的实例属性推断为可选。
文件名:test.py
from sqlalchemy.orm import decl_api, registry
from sqlalchemy import BigInteger, Column, String
mapper_registry = registry()
class Base(metaclass=decl_api.DeclarativeMeta):
__abstract__ = True
registry = mapper_registry
metadata = mapper_registry.metadata
__init__ = mapper_registry.constructor
class Person(Base):
__tablename__ = "persons"
id = Column(BigInteger, primary_key=True, autoincrement=True)
name = Column(String(40), nullable=False)
def main(person: Person):
person_id = person.id
person_name = person.name
reveal_locals()
Run Code Online (Sandbox Code Playgroud)
运行mypy test.py
产量:
test.py:27: note: Revealed local types are:
test.py:27: note: person: test.Person
test.py:27: note: person_id: Union[builtins.int, None]
test.py:27: …
Run Code Online (Sandbox Code Playgroud) 我正在使用该inspect
模块来了解有关函数命名空间的更多信息:
import inspect
def foo():
inspect.__cache__.update({'dummy': 0}) # Could be any class/attribute here
print(inspect.getclosurevars(foo))
Run Code Online (Sandbox Code Playgroud)
重新格式化输出:
ClosureVars(
nonlocals={},
globals={'inspect': <module 'inspect' from ='C:\\Users\\guido\\AppData\\Local\\Programs\\Python\\Python39\\lib\\inspect.py'>},
builtins={},
unbound={'__cache__', 'update'}
)
Run Code Online (Sandbox Code Playgroud)
为什么函数中使用的对象的属性(即__cache__
在update
这种特殊情况下)被称为未绑定变量?
仔细观察,inspect.getclosurevars
可以确定字节码中的未绑定变量。更具体地说,它返回变量 in foo.__code__.co_names
that is in foo.__globals__
。
所以真正的问题可能是:
foo.__code__.co_names
当前定义?这本身就是一个难题,因为它的定义似乎尚未确定inspect
确定变量是否正确?unbound
这里的正确是指返回值是否符合变量的定义unbound
。如下图所示,_S@map
和是什么_T@map
意思?
附加信息:
查看multiprocessing.Pool.map
定义,没有类型提示,因此上面的类型必须由 Pylance 自动生成,Pylance 是我使用的语言服务器
def map(self, func, iterable, chunksize=None):
'''
Apply `func` to each element in `iterable`, collecting the results
in a list that is returned.
'''
return self._map_async(func, iterable, mapstar, chunksize).get()
Run Code Online (Sandbox Code Playgroud) 官方文档和此博客位于同一网站 - 建议安装尽可能多的需求,conda
然后使用 pip。显然这是因为conda
将不知道对依赖项所做的任何更改pip
,因此无法正确解析依赖项。
现在,如果一个人专门使用pip
并且不安装任何东西conda
,那么似乎有理由期望conda
不需要知道所做的任何更改pip
- 因为conda
实际上变成了一个隔离依赖项和管理版本的工具。然而,这违背了官方建议,因为人们不会安装尽可能多的要求conda
。
所以问题仍然存在:在环境中专门使用是否有任何已知的缺点?pip
conda
此处触及了一些类似的主题,但不涵盖专门在环境中使用的情况。我也来过这里:pip
conda
python ×4
anaconda ×1
conda ×1
cpython ×1
docstring ×1
mypy ×1
pip ×1
pylance ×1
python-3.x ×1
sqlalchemy ×1