如何从 python TypedDict 获取键类型

2023-11-23

如果我有一个像这样的 TypedDict:

class Td(TypedDict):
    bar: str
    foo: str

并且想要有一个函数,其参数需要是 TypedDict 的键,例如:

def hello_Td(key: str, td: Td):
    return 'Hello ' + td[key]

使用上面的代码,我收到一条警告,指出键是 str,预期为 Literal['bar', 'foo']。

有没有办法自动生成该文字联合类型?

就像是:

td_keys = Literal(Td.keys())
def hello_Td(key: td_keys, td: Td):
    return 'Hello ' + td[key]

Update 1

RepEx: https://pastebin.com/vaVpJCBv enter image description here


您的首要任务应该是创建一个新的数据类型来表示允许的字典键。

让我们假设新的数据类型被命名为Country

from enum import Enum, auto

class Country(Enum):
    def _generate_next_value_(name, start, count, last_values):
        return name
    RUSSIA        = auto()
    CHINA         = auto()
    UNITED_STATES = auto()
    AUSTRALIA     = auto()
    BRAZIL        = auto()

让我们看一些例子:

example1 = Country("UNITED_STATES")
example2 = Country("RUSSIA")

print("str(example1)".ljust(20), " == ", str(example1))
print("repr(example1)".ljust(20), " == ", repr(example1))
print("example2".ljust(20), " == ", example2)
print("example1.value".ljust(20), " == ", example1.value)
print("example1.name".ljust(20),  " == ", example1.name)

打印到控制台的输出如下:

str(example1)         ==  Country.UNITED_STATES
repr(example1)        ==  <Country.UNITED_STATES: 'UNITED_STATES'>
example2              ==  Country.RUSSIA
example1.value        ==  UNITED_STATES
example1.name         ==  UNITED_STATES

通常,枚举数据类型是整数。
例如RUSSIA == 41.
然而,使用字符串更具自记录性。

请随意使用枚举数据类型以外的其他类型(enum)。目标只是创建一个类来表示允许的字典键。

下面是一个实现not枚举数据类型:

import string

class Kountry:
    BRAZIL        = "BRAZIL"
    CHINA         = "CHINA"
    UNITED_STATES = "UNITED_STATES"

    def __init__(this, dirty_stryng:str):
        stryng = "".join(str(ch) for ch in dirty_stryng)
        stryng = stryng.upper()
        is_letter = lambda ch: ch in string.ascii_uppercase
        stryng = "".join(filter(is_letter, stryng))
        if not stryng in type(this).COUNTRIES:
            # print invalid input
            # maximum 30 characters. do not print 9,000 characters
            # remove line-breaks, carriage returns etc...
            # string representation of invalid input must fit all on one line
            msg = repr(str(dirty_stryng))[:30]
            raise ValueError(msg)
        this._string = stryng

    def __getattr__(this, attrname:str):
        if has_attr(this._string, attrname):
            return getattr(this._string, attrname)
        return getattr(type(this), attrname)

    def __str__(this):
        return this._string

我们可以把这个非enum出去转转:

brazil = Kountry("brazil")
r = str(brazil)
print("str(brazil)".ljust(20), " is ", r)
r = brazil.split()
print("brazil.split()".ljust(20), " is ", r)
r = brazil.join("$-@")
print("brazil.join(\"$-@\")".ljust(20), " is ", r)

控制台输出为:

str(brazil)           is  BRAZIL
brazil.split()        is  ['BRAZIL']
brazil.join("$-@")    is  $BRAZIL-BRAZIL@

定义一个名为“的新数据类型后Country”,然后您需要执行以下操作:

  1. 定义函数,其输入参数必须是Country class.

  2. 创建一个字典,其键必须是Country class.


我们可以创建一个函数,其参数应该是 Country 类的实例,如下所示:

def to_pretty_string(cntry:Country):
    country_str = str(cntry.name)
    out_str = "-xXx-".join(["", country_str, ""])
    return out_str

我写的地方:Country在输入参数上...那是一个 python ”类型提示". The 类型提示表示函数参数应该是Country class.

如果您好奇,当我们调用(使用)时,我们会在控制台上输出以下内容to_pretty_string功能:

print(to_pretty_string(Country.BRAZIL))
print(to_pretty_string(Country.UNITED_STATES))
print(to_pretty_string(Country.RUSSIA))

# -xXx-BRAZIL-xXx-
# -xXx-UNITED_STATES-xXx-
# -xXx-RUSSIA-xXx-

用像这样的语言C++,我们会使用“模板类” 字典中。Java,它们被称为“泛型”而不是“模板”。但是,无论称为“模板类”还是“泛型类”,都是相同的概念

我希望以下是真实的代码:

# WARNING: this is not real python

# Create a dictionary whose keys are Countries
head_counts = Dict[Country]

# Populate the dictionary
head_counts[Country.UNITED_STATES] = 329.5*1000000
head_counts[Country.RUSSIA]        = 144.1*1000000
head_counts[Country.BRAZIL]        = 212.6*1000000

# End of wishful thinking  

然而,Python 编程语言在其标准库中并没有太多通用类的方式。您可能必须编写自己的类才能拥有仅包含字符串键的字典(Dict[str]) 或键仅为十进制数字的字典 (Dict[float])

我们能做的就是创建一个类型提示.

但是,那类型提示不创建真正的字典;仅在参数列表中使用一个特殊对象来指定该对象可能应该是一个字典,其键是 Country:

import typing as typ
import Country 

def funky_the_function(dee:typ.Dict[Country, object]):
    print("Keys to `dee` should be instances of `Country`")
    dee[Country.UNITED_STATES] = 329.5*1000000
    dee[Country.RUSSIA]        = 144.1*1000000
    dee[Country.BRAZIL]        = 212.6*1000000
    dee[342] # Danger Will Robinson! Danger!
    return
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 python TypedDict 获取键类型 的相关文章

随机推荐

  • 如何使用 QTextEdit 结束行

    我正在尝试创建QTextEdit有一些文本 在这段文本中我有行尾字符 n 但它不被接受QTextEdit对象 整个文本显示 没有任何中断 有什么理由吗 如果您使用的是 Qt 4 3 或更高版本 那么您可以使用 您可以使用以下命令关闭富文本编
  • 如何创建 dotnet core 单个可执行文件

    我想将我的 dotnet core 项目配置为编译为单个可执行文件 该项目与使用生成的项目类似dotnet new version 1 0 0 buildOptions debugType portable emitEntryPoint t
  • 为什么使用 QuantifiedConstraints 指定类型类的子类还需要子类的实例?

    我正在尝试多种无标签编码Free LANGUAGE PolyKinds LANGUAGE TypeSynonymInstances LANGUAGE TypeFamilies LANGUAGE Rank2Types LANGUAGE Fle
  • 如何从文本输入将锚标记添加到 URL

    我希望能够在评论字段中获取用户输入的文本并检查 URL 类型表达式 如果存在 则在显示评论时添加锚标记 到 url 我在服务器端使用 PHP 在客户端使用 Javascript 带有 jQ uery 所以我应该等到 URL 显示之前才检查它
  • 对 XML 模式进行版本控制的最佳实践是什么?

    我经常需要为不同的基于 XML 的导入例程设计 XML 模式 很明显 XML 模式会随着时间的推移而发展 或者它们可能包含需要修复的错误 因此捕获模式的版本并拥有某种机制来绑定特定版本非常重要 目前我有两种情况 该错误是在架构中发现的 并且
  • 将 2D 数组组合到 3D 数组

    你好 我有 3 个 numpy 数组 如下所示 gt gt gt print A 1 0 0 3 0 0 5 2 0 2 0 0 1 2 1 gt gt gt print B 5 9 9 37 8 9 49 8 3 3 3 1 4 4 5
  • 确定浮动元素中的换行位置

    假设我有六个 div 容器内的元素 div 这六个 div 中的每一个都是一个正方形并且具有 CSS 样式float left应用 默认情况下 当它们到达容器的边缘时 div 他们会包裹起来 现在 我的问题是 使用Javascript 是否
  • 实现可扩展性的最佳数据访问范例是什么?

    微软提供了许多不同的数据访问选项 哪一种最适合可扩展的应用程序 Linq 我们应该使用 Linq 吗 这看起来确实很简单 但如果您了解 SQL 它确实会有帮助 我还听说您无法使用 Linq 在 ASP NET 中运行异步查询 因此我想知道它
  • 如何使用 BeautifulSoup 获取选项文本

    我想使用 BeautifulSoup 来获取以下 html 中的选项文本 例如 我想获取 2002 12 2003 12 等
  • 使用Python/PIL裁剪图像的非对称区域

    有没有办法剪掉non使用 Python PIL 绘制图像的矩形区域 例如在这张图片中 我想排除所有黑色区域以及塔 屋顶和电线杆 http img153 imageshack us img153 5330 skybig jpg 我猜是图像路径
  • 函数模板可以用作高阶函数调用中的一等公民吗?

    将函数模板作为参数传递给另一个函数模板总是有点棘手 通常 人们必须创建一个 lambda 对象来调用原始函数 Example template
  • 在 Swift 中实现哈希组合器

    我正在延长一个struct符合Hashable 我将使用DJB2哈希组合器来完成此操作 为了使编写其他东西的哈希函数变得容易 我想扩展Hashable协议 以便我的哈希函数可以这样写 extension MyStruct Hashable
  • 数据库架构更改时 Azure 无缝升级

    假设我有一个生产部署和临时部署 两者都使用自己的 SQL Azure 数据库 如果暂存中的模式已更改并且需要部署到生产中 是否有一种定义的方法可以在生产数据库上实现数据库升级 无需停机 例如如果我交换 VIP staging 生产 同时以某
  • 如何为字符串数组中的每个元素添加字符串前缀?

    我想知道在Java中是否有一个函数可以将定义的字符串添加到字符串数组的每个字符串的开头 例如 my function apple orange ant eat an would return eat an apple eat an oran
  • 无法更新在 AFTER INSERT 中执行触发器的表

    我正在运行 MySQL 5 5 9 和 InnoDB 我尝试创建一个版本化表 其中current字段指示记录是否是最新版本 就像是 autonumber id name current 1 1 Yes 0 2 1 No 1 不管怎样 我过去
  • 成功的ajax调用后数据表不更新

    我有一个数据表 表的每一行都有一个commandButton called Remove 这应该从模型和视图中删除该行并就地执行更新 作为页脚 我还有另一个commandButton called 删除每一行 最后一个按钮有效 我单击它 每
  • Maven jersey-multipart 缺少 javax.ws.rs.core.Response 的依赖项

    我似乎缺少依赖项 但找不到解决方案 我已确保所有球衣版本均与回答的相同here Error SEVERE The following errors and warnings have been detected with resource
  • WSO2 ESB:将 JSON 提交到代理服务时出现意外字符错误

    我正在尝试使用 WSO2 ESB 4 9 0 中的 WSO2 Facebook 连接器从 Facebook 检索数据 我在下面提供了代理配置
  • 从折线图创建一维热图

    是否可以根据折线图中的数据创建一维热图 即我希望 y 中的最高值代表热图中较暖的颜色 我附上了我希望它看起来像的热图示例图像以及我当前在线图中的数据 一维热图和图表示例 为了获取图像中显示的热图 我在 python 中使用了以下代码和 ma
  • 如何从 python TypedDict 获取键类型

    如果我有一个像这样的 TypedDict class Td TypedDict bar str foo str 并且想要有一个函数 其参数需要是 TypedDict 的键 例如 def hello Td key str td Td retu