首页 > 编程问答 >带 ClassVar 的通用类型别名

带 ClassVar 的通用类型别名

时间:2024-07-30 13:32:37浏览次数:12  
标签:python generics python-typing

我目前的类型注释看起来类似于以下内容,我想使用 键入别名 以免重复太多:

类具有类变量,可以是:

  • 某些指定的类型,或
  • 一个函数(带参数)返回该 相同的 类型。
class Foo(object):
  state:  ClassVar[Union[str, Callable[[SomeObject], str]]]  # str or func->str
  number: ClassVar[Union[int, Callable[[SomeObject], int]]]  # int or func->int
  foobar: ClassVar[Union[bool, Callable[[SomeObject], bool]]] # bool or func->bool
# end class

为了完整起见,这里是一个示例实现:

class FooBar(Foo):
   state = "something"
   number = lambda x: int(x.bla)
   
   @classmethod
   def foobar(cls, x):
     return x.blabla == cls.state
   # end def
# end class

但是我不知道如何制作可订阅的泛型。我正在寻找类似的东西:

ClassValueOrCallable = lambda T: ClassVar[Union[T, Callable[[SomeObject], T]]]

class Foo(object):
  state:  ClassValueOrCallable(str)
  number: ClassValueOrCallable(int)
  foobar: ClassValueOrCallable(bool)

编辑:
以下 mypy的泛型类型别名部分 ,似乎应该可以将其写为

T = TypeVar('T')  # Any type.
ClassValueOrCallable = ClassVar[Union[T, Callable[[SomeObject], T]]]

class Foo(object):
  state:  ClassValueOrCallable[str]
  number: ClassValueOrCallable[int]
  foobar: ClassValueOrCallable[bool]

但至少PyCharm没有认识到这一点,并且只是将类型显示为 Any ,所以我不太确定它是否正确。 pycharm quick-docs showing 'Any'


对泛型类型别名的语法是正确的。遇到的问题很可能是 PyCharm 的类型检查器无法完全理解它,而不是语法本身的问题。

以下是一些可以尝试的解决方法:

  1. 使用 typing.Type 代替 T : ```python from typing import Type, Union, Callable, ClassVar

    T = TypeVar('T') SomeObject = TypeVar('SomeObject') ClassValueOrCallable = ClassVar[Union[T, Callable[[SomeObject], T]]]

    class Foo(object): state: ClassValueOrCallable[str] number: ClassValueOrCallable[int] foobar: ClassValueOrCallable[bool] ``` 这可能有助于 PyCharm 更好地推断类型。

  2. 添加类型提示到 SomeObject : ```python from typing import Type, Union, Callable, ClassVar

    T = TypeVar('T') class SomeObject: ... ClassValueOrCallable = ClassVar[Union[T, Callable[[SomeObject], T]]]

    class Foo(object): state: ClassValueOrCallable[str] number: ClassValueOrCallable[int] foobar: ClassValueOrCallable[bool] ```

  3. 忽略类型错误 : 如果确定代码在类型方面是正确的,可以暂时忽略 PyCharm 的错误。可以使用 # type: ignore 注释来做到这一点:

    python class Foo(object): state: ClassValueOrCallable[str] # type: ignore number: ClassValueOrCallable[int] # type: ignore foobar: ClassValueOrCallable[bool] # type: ignore

  4. 更新 PyCharm : 确保使用的是最新版本的 PyCharm,因为较旧的版本可能不支持所有最新的类型提示功能。

  5. 使用 MyPy : 如果想更严格地检查类型,可以使用 MyPy 这样的工具。MyPy 通常比 IDE 的内置类型检查器更强大。

请注意,即使 PyCharm 可能无法完美地理解类型别名,但只要语法正确,的代码仍然可以正常运行,并且 MyPy 等工具应该能够正确地检查类型。

标签:python,generics,python-typing
From: 56317409

相关文章

  • 学会用Python爬取小说网站,想看什么就爬什么,广告也不用看了~
    今天以爬取笔趣阁小说网站为例,练习Python爬虫技术。通过这个爬虫,可以完成批量爬取一本小说的所有章节,并将所有章节内容按顺序保存到一个txt文档内,下面我们就开始吧。首先,百度搜索“笔趣阁”,发现有很多网站都叫笔趣阁。我们可以随便挑选一个网站尝试,本文我以‘https://......
  • 计算机毕业设计django+vue《Python数据分析》的教学系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今数字化时代,数据分析已成为各行各业不可或缺的技能之一,而Python作为数据分析领域的首选语言,其重要性日益凸显。然而,传统的教学模式在......
  • 如何将多个变量分配给 python 函数中的单个参数?
    我正在尝试编写一个程序,如果可能的话,它需要一个三项式并对其进行因式分解。每当用户输入A、B和C时,三项式应该通过Factor(product,summation)函数获取,但我似乎无法弄清楚如何将A和C分配给乘积arg,将B分配给我尝试在函数外部声明不同的变量,product=(a*c)和summati......
  • python - 从文本生成音乐
    请给我一些建议为了解释一下,我输入“深度睡眠的睡眠音乐”,它将返回一个wav文件:https://www.youtube.com/watch?v=1wAdQhFJy54或者我给出一个wav文件,它会返回相同的现在这是我尝试过的:https://github.com/facebookresearch/audiocraft......
  • 从零开始的Python开发日记(7):短信验证功能开发流程
    短信验证功能开发流程在开发一个包含登录、注册以及短信验证的功能时,你需要遵循一个系统的开发流程。以下是实现这一功能的基本步骤,包括所需的技术和代码示例。1.环境配置首先,确保你的开发环境已经配置好,并安装了必要的库和工具。pipinstallfastapiuvicornsqlalche......
  • 【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
    目录​编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值​编辑2.2.2二维插值3.插值的应用场景3.1数据平......
  • 在家用电脑上设置 Python 和 Jupyter,尝试打开 Jupyter 笔记本并显示错误,无法获取
    我有最新的Python版本3.12.4和以下版本的Jupyter:SelectedJupytercorepackages...IPython:8.26.0ipykernel:6.29.5ipywidgets:notinstalledjupyter_client:8.6.2jupyter_core:5.7.2jupyter_server:2.14.2jupyterlab......
  • Python - Reloading a module
    Eachmoduleisloadedintomemoryonlyonceduringaninterpretersessionorduringaprogramrun,regardlessofthenumberoftimesitisimportedintoaprogram.Ifmultipleimportsoccur,themodule’scodewillnotbeexecutedagainandagain.Suppose......
  • vscode python 3.7 pylance debugpy 插件 vsix
    可能报错  crashed5timesinthelast3minutes.Theserverwillnotberestarted.  ---pylance 可能报错  cannotreadpropertiesofundefinedreadingresolveEnvironment   --- debugger可能      vscodepython3.7调试没有反应......
  • Python获取秒级时间戳与毫秒级时间戳的方法[通俗易懂]
    参考资料:https://cloud.tencent.com/developer/article/21581481、获取秒级时间戳与毫秒级时间戳、微秒级时间戳代码语言:javascript复制importtimeimportdatetimet=time.time()print(t)#原始时间数据print(int(t))......