如何进行仅类型注释的类型断言?

2023-12-29

我有两个功能:

def get_foo(params) -> Optional[str]
def bar(foo: str)

以及将这些函数链接在一起的函数:

def f(params):
    # other stuff up here
    foo = get_foo(params)
    return bar(foo)

我知道根据我的函数中发生的其他事情,结果是get_foo will never没有。

当我跑步时mypy针对这个文件,我当然会得到错误:

error: Argument 1 of "bar" has incompatible type "Optional[str]"; expected "str"

这是有道理的。

我可以添加一个assert foo is not None声明,但这是热路径代码,在我的测试中它具有可测量的性能影响。我只想为 mypy 进行类型断言。我怎么做?

编辑:我也尝试添加评论#type: str在赋值语句之后,但这会产生类似的错误


你不会为此感到高兴的。向静态类型检查器断言值具有特定类型的官方设计方法是typing.cast https://docs.python.org/3/library/typing.html#typing.cast,我相信这是一个具有实际运行时间成本的实际函数moreassert你想更换。它只是返回第二个参数不变,但仍然有函数调用开销。 Python 的类型注释系统并不是采用零开销类型断言语法设计的。

作为替代方案,您可以使用Any作为“逃生舱口”。如果你注释foo与类型Any, mypy 应该允许bar称呼。局部变量注释没有运行时成本,因此唯一的运行时成本是额外的局部变量存储和查找:

from typing import Any

def f(params):
    foo: Any = get_foo(params)
    return bar(foo)

除此之外,您最好的选择可能是使用assert并使用以下命令运行 Python-O标志,禁用断言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何进行仅类型注释的类型断言? 的相关文章

随机推荐

  • Laravel Dusk,DatabaseTransactions 不执行回滚

    我正在使用 Laravel Dusk 以下注册测试工作正常 只是它不会回滚事务 即在 注册 上创建的用户记录始终保留在数据库中 我的表都设置为使用 InnoDB 引擎 对发生的事情有什么想法吗 我在很多地方都放了日志 看起来没有什么特别错误
  • 从专用网卡访问时,Rails 显示 IP 为 127.0.0.1,但 Nginx 显示正确的 IP。公共 IP 转发良好

    我们正在 Unicorn Nginx 上运行 Rails 应用程序 服务器有两个我们使用的网卡 eth0处理公共互联网的请求 以及eth2处理来自我们专用网络的请求 当请求通过时eth0 nginx日志显示公共IP Rails日志也显示此I
  • 在 xcode 中添加另一个团队

    这个问题不是重复的在 xcode 中添加另一个团队 https stackoverflow com questions 32610740 adding another team to xcode or 受邀加入开发团队时如何从 Xcode
  • 如何在 C# 中复制类的实例

    C 有没有办法复制对象 就像是 var dupe MyClass original 我希望它们相等 以便所有数据成员都相同 但不共享相同的内存位置 您可能正在谈论深层复制 深拷贝与浅拷贝 https stackoverflow com qu
  • 一次自动静音播放多个 YouTube 视频

    我正在尝试制作一个使用 YouTube iframe API 来显示多个视频的网页 这些视频在加载时自动开始播放 我希望 4 个视频中的 3 个开始静音播放 但第 4 个视频有音频播放 最后 我尝试创建一个静音 取消静音和暂停 开始按钮 让
  • JSON 数据未显示,而是显示空白屏幕

    尝试制作一个简单的应用程序 从服务器获取 JSON 数据并将它们显示在自定义列表中 这是非常简单的事情 但是当我运行该应用程序时 它显示白色空白屏幕 但没有数据 它也没有显示任何错误 我假设如果有任何错误它就不会在我的手机中运行 但不显示获
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • csv 到 xml:不确定在 Mule ESB 中执行此操作的最佳方法

    我是 Mule 的新手 所以请耐心等待 我收到以下 CSV 文件 Company1 2 123 Street Winchester UK 000010 CHRISTINE I HAAS A00 3978 1995 01 01 PRES 18
  • Java - 在不同的进程中启动另一个类的main

    我需要一种干净的方法来使用 GUI 启动 Java 程序的许多实例 并且我想以编程方式执行此操作 我想要运行的 程序 只是一个 class 文件 带有 main 方法的已编译的 java 文件 它应该显示一个 GUI 并独立于其他文件运行
  • Laravel Eloquent - 如果列值为 NULL 或 0,则不运行关系查询

    我的内部有各种各样的关系Eloquent Models看起来像这样 public function main image return this gt hasOne Media class id main image id 然而 如果mai
  • 创建行并将其写入文件

    是否可以创建一个文件并在 vbscript 中向其中写入行 类似的东西蝙蝠中的回声 file echo something something gt gt sometextfile txt 执行 vbscript 时 根据脚本的路径将创建一
  • 通过 debconf-set-selections 为 mysql 预配置一个空密码

    我正在设置一个 bash 脚本来自动构建 LAMP 环境 我在用debconf set selections在安装 mysql phpmyadmin 等之前设置选项 主要是效果很好 但问题是我have to为 mysql 设置一个空密码 即
  • 如何知道给定用户是否已使用 MSAL 登录?

    使用 msal js 库 Microsoft 身份验证库 这是了解给定用户是否已登录的方法 我的目的是避免在用户的凭据已保存在浏览器存储中时显示登录弹出窗口 我目前的做法 function isUserLoggedIn username c
  • PreparedStatement 上的 ArrayOutOfBoundsException

    我在这里不知所措 有人能看出这段代码有什么问题吗 我将 sqlite 与此驱动程序一起使用 https bitbucket org xerial sqlite jdbc downloads https bitbucket org xeria
  • 在 Android 上准备媒体记录器时出现延迟

    我正在 10 秒内录制多个小视频 在创建任何视频之前 我需要一次又一次地准备和启动媒体录制器 因此 每个视频都有一两秒的时间滞后 在准备像 Instagram 这样的媒体记录器时 有什么方法可以避免这种时间延迟吗 public boolea
  • 如何在选择文件之前禁用提交按钮

    我有一个 HTML 文件上传页面 我需要在选择文件之前禁用提交按钮 然后提交按钮将被启用 用户可以上传 我假设我可以使用 jQuery 代码来查询文件上传字段的值 以查看是否已选择上传文件 我假设我可以检查焦点何时离开文件上传字段 我担心的
  • 我添加了 MAX7320 i2c 输出芯片。如何让内核为其加载驱动程序?

    我已将 MAX7320 i2c 扩展器芯片添加到 ARM Linux 板上的 i2c 总线 0 该芯片可以通过用户空间的命令正常工作 例如 usr sbin i2cset y 0 0x5d 0x02 and usr sbin i2cget
  • 如何使用 FFMPEG+Imagemagick 从图像/视频中提取有组织的调色板?

    我使用 FFMPEG 和 Imagemagick 通过 Windows 批处理文件从图像或视频中提取调色板 get current folder name for in do set CurrDirName nx get current f
  • 在 Snakemake 脚本中使用 argparse

    是否可以将自定义命令行参数传递给snakemake脚本 我已经尝试过了 但是用以下命令执行 Snakefileargparse结果出错snakemake error unrecognized arguments zz 下面是一个示例脚本 i
  • 如何进行仅类型注释的类型断言?

    我有两个功能 def get foo params gt Optional str def bar foo str 以及将这些函数链接在一起的函数 def f params other stuff up here foo get foo p