Union 赋值中的不兼容类型

2024-01-16

Mypy 向我打印以下消息:

x.py:74: 错误:赋值中的类型不兼容(表达式具有类型 “Union[str, Dict[str, str]]”,变量的类型为“str”)

是不是很奇怪?str是其一部分Union[str, Dict[str, str]]

代码如下:

def get_multiple(fields: List[str], config_data) -> Dict[str, str]:
    config_results = {k: v for k, v in config_data.items() if k in fields}
    log_missing_fields(fields, config_results)
    return config_results


def get_single(field: List[str], config_data) -> str:
    result = config_data.get(field)
    if result is None:
        log.warning('The following fields are missing: %s', field)
    return result


def get(fields: Union[str, List[str]]) -> Union[str, Dict[str, str]]:
    log.debug('Retrieving values %s from config', str(fields))
    config_data = read_config()
    get_data = get_multiple if isinstance(fields, list) else get_single
    return get_data(fields, config_data)


def get_ts_url() -> str:
    timeout = get('timeout')  # type: str <-- Line 74 is here
    log.info('Trying to connect the servers.')
    with db_session() as db_handler:
        url = scan_availability(db_handler, int(timeout))

    if url:
        return url

    log.critical("Could not find available servers.")
    raise ConnectionError("Could not find available servers.")

避免此问题的正确方法是使用@overload装饰器来描述函数参数与其结果之间的关系。

功能get()将返回一个str(实际上是一个Optional[str]因为它也可能返回None)如果通过了str如果传递了一个字典,它将返回一个字典list。以下是我们如何使用类型注释来描述这一点:

from typing import *


def read_config() -> Dict[str, str]:
    return {}


def get_multiple(fields: List[str], config_data: Dict[str, str]) -> Dict[str, str]:
    config_results = {k: v for k, v in config_data.items() if k in fields}
    return config_results


def get_single(field: List[str], config_data: Dict[str, str]) -> Optional[str]:
    result = config_data.get(field)
    return result


@overload
def get(fields: str) -> Optional[str]: ...

@overload
def get(fields: List[str]) -> Dict[str, str]: ...

def get(fields):
    config_data = read_config()
    get_data = get_multiple if isinstance(fields, list) else get_single
    return get_data(fields, config_data)


def get_ts_url() -> None:
    timeout = get('timeout')
    if TYPE_CHECKING:
        reveal_type(timeout)

如果你对此运行 mypy 它将打印

Revealed type is 'Union[builtins.str, builtins.None]'

将来我还建议在发布之前花几分钟来简化您的示例,以便其他人可以重现它。

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

Union 赋值中的不兼容类型 的相关文章

随机推荐

  • 按组编号[重复]

    这个问题在这里已经有答案了 假设我们有以下数据库 ID Shoot hit 1 10 2 1 9 3 1 8 1 2 10 8 2 8 8 2 11 10 2 7 2 3 9 2 4 6 6 4 6 5 我希望为每个组分配编号 在本例中为每
  • 查找文本并替换为超链接

    我正在尝试将正文中的文本替换为模式 ASA 到 ASA 超链接 如果主体中只有一种模式 我的代码就可以工作 但如果我有很多模式 比如 ASA3422dfASA2389dsASA1265sa 整个身体被替换为 ASA互易65 我的代码在这里
  • 如何在 scikit-learn(用于计算机视觉)中使用自己的数据集?

    如何在 scikit learn 中使用我自己的数据集 Scikit教程总是以加载他的数据集 数字数据集 花卉数据集 为例 http scikit learn org stable datasets index html http scik
  • 如何标准化 Wordnet 中的相似性度量

    我正在尝试计算两个单词之间的语义相似度 我正在使用基于 Wordnet 的相似性度量 即 Resnik 度量 RES Lin 度量 LIN Jiang 和 Conrath 度量 JNC 以及 Banerjee 和 Pederson 度量 B
  • Laravel hasMany 与 where 处于多态关系

    我有 3 张桌子 汽车 公寓和商店 每张桌子都有它的照片 照片存储在数据库中 我只想使用一张照片表 我不想为每辆汽车 公寓和商店创建照片表 Photos表结构是这样的 id photo url type destination id 1 h
  • 如何在 Windows 版 Git Bash 中更改 RGB 颜色?

    我在 Windows 中使用 Git Bash 并用于我的自定义目的git log格式 我想修改终端的确切 RGB 颜色值 以便我可以微调颜色输出 我的全局git日志格式如下 gitconfig lg1 log graph abbrev c
  • 如何更改javafx TextField中文本的颜色?

    我想更改 TextField 中的字体颜色 我发现 fx background color fx border color用于更改背景和边框的颜色 但不用于更改文本 设置 fx text fill对我有用 见下文 if passed res
  • 如何定位特定 div ID 的标题?

    我正在尝试使用与页面其余部分的标题不同的字体系列来设置标题中的所有标题的样式 但我无法使样式仅适用于特定的标题 ID 这是我尝试过的 header h1 h2 h3 h4 font family Helvetica 但这会导致所有 h1 2
  • 存储数百万张图像[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 扩展 UserPrincipal 类

    我扩展了 UserPrincipal 类来检索我需要的一些缺失的属性 DirectoryObjectClass user DirectoryRdnPrefix CN class UserPrincipalExt UserPrincipal
  • 如何消除 OSX10.10 SDK 中的 module.map 警告?

    自从将 Xcode 更新到版本 6 3 以来 我在编译 C 代码时收到以下警告 Applications Xcode app Contents Developer Platforms MacOSX platform Developer SD
  • 使未定义的变量在 php 中成为错误

    我有以下代码片段 它打印出一个警告bla未定义 但随后继续 我希望 php 在遇到未定义的变量时抛出错误并停止代码执行 怎么做 以上只是一个例子 我想处理数千个块内的每个未定义变量 您可以编写自己的错误处理程序 并在遇到此类通知时使其停止执
  • 如何从标准输入中提取 tar 存档?

    我有一个很大的 tar 文件split 是否有可能cat并使用管道解压文件 就像是 cat largefile tgz aa largefile tgz ab tar xz 代替 cat largefile tgz aa largfile
  • Android WebView 加载失败 (net::ERR_CLEARTEXT_NOT_PERMITTED)

    有人能帮助我吗 我在 Android 应用程序中使用 WebView compileSdkVersion 29 buildToolsVersion 29 0 0 minSdkVersion 16 targetSdkVersion 29 我在
  • Xcode UI 测试 - 使用 addSubview 添加的 Uiview 对于 UI 测试完全不可见

    我一直在尝试 XCode 7 3 上的新 UI 测试 并且发现了对我来说似乎是一个错误 问题是通过 添加的视图 添加子视图 方法对于UI测试系统来说似乎是完全不可见的 我有这样的看法 这个 UIview 创建代码 let container
  • 如何使用 *ngFor 迭代对象键?

    我一直在挖掘 发现我可以使用以下方法在对象上使用 ngFor div div where ObjNgFor管道是 Pipe name ObjNgFor pure false export class ObjNgFor implements
  • XHTML:将 DIV 放置在 A 标记中

    Is it alright将 div 标签放置在锚标签内 div 的内容会将页面重定向到锚标记的 href 吗 将 div 标签放在锚标签内可以吗 Yes if 您正在使用 HTML5 XHTML5 和 锚标记不在内联上下文中 即仅允许短语
  • 如何使用php从url读取xml文件

    我必须从 URL 读取 XML 文件 map url http maps google com maps api directions xml origin merchant address url destination customer
  • 从 PHP 中的函数返回多个值 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有这个函数 在调用它时返回三个值
  • Union 赋值中的不兼容类型

    Mypy 向我打印以下消息 x py 74 错误 赋值中的类型不兼容 表达式具有类型 Union str Dict str str 变量的类型为 str 是不是很奇怪 str是其一部分Union str Dict str str 代码如下