Polars API 注册和类型检查器

问题描述 投票:0回答:1
在使用 Polars 命名空间注册函数时,我总是从 mypy 或 Pyright 收到类型错误。除了每次使用自定义命名空间中的函数时提示

# type: ignore[attr-defined]

 之外,还有什么方法可以避免类型检查器错误?

示例来自官方文档

https://docs.pola.rs/py-polars/html/reference/api.html :

文件

checker.py

import polars as pl @pl.api.register_expr_namespace("greetings") class Greetings: def __init__(self, expr: pl.Expr): self._expr = expr def hello(self) -> pl.Expr: return (pl.lit("Hello ") + self._expr).alias("hi there") def goodbye(self) -> pl.Expr: return (pl.lit("Sayōnara ") + self._expr).alias("bye") print(pl.DataFrame(data=["world", "world!", "world!!"]).select( [ pl.all().greetings.hello(), # type: ignore[attr-defined] pl.all().greetings.goodbye(), ] ))
% mypy checker.py
checker.py:19: error: "Expr" has no attribute "greetings"  [attr-defined]
Found 1 error in 1 file (checked 1 source file
% mypy --version
mypy 1.8.0 (compiled: yes)
% pyright checker.py
/path/to/checker.py
  /apth/to/checker.py:19:18 - error: Cannot access member "greetings" for type "Expr"
    Member "greetings" is unknown (reportGeneralTypeIssues)
1 error, 0 warnings, 0 informations
% pyright --version
pyright 1.1.343
    
python mypy python-typing python-polars pyright
1个回答
0
投票
您应该使用

# type: ignore[attr-defined]
 抑制。

mypy

pyright
 这样的静态类型检查器往往不太适合动态创建属性。如果有很多错误需要抑制,您可以在文件顶部附近添加注释,以抑制对整个文件的特定检查。

以下是

mypy

的操作方法:

# mypy: disable-error-code="attr-defined" import polars as pl ...
这是如何做到这一点的

pyright

# pyright: reportGeneralTypeIssues=false import polars as pl ...
通常,处理此问题的方法是为自定义 

__getattr__

__setattr__
 dunder 方法添加类型提示。 (有关更多详细信息,请参阅
this问题)。然而,由于此更改需要修改 Polars 代码,因此最好的解决方案是简单地抑制错误。

© www.soinside.com 2019 - 2024. All rights reserved.