首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NamedTuple中键入函数属性

如何在NamedTuple中键入函数属性
EN

Stack Overflow用户
提问于 2022-03-22 21:18:04
回答 1查看 56关注 0票数 0

我有一段代码

代码语言:javascript
复制
from typing import Callable, NamedTuple, TypeVar


def f1(x: int) -> int:
    return x


def f2(y: str) -> int:
    return len(y)


T = TypeVar("T", int, str)


class Config(NamedTuple):
    func: Callable[[T], int]


c1 = Config(func=f1)
c2 = Config(func=f2)

Mypy抱怨:

代码语言:javascript
复制
toy.py:19:18: error: Argument "func" to "Config" has incompatible type "Callable[[int], int]"; expected "Callable[[Config], int]"
toy.py:20:18: error: Argument "func" to "Config" has incompatible type "Callable[[str], int]"; expected "Callable[[Config], int]"
Found 2 errors in 1 file (checked 1 source file)

为什么它会期望"Callable[[Config], int]"

我使用Python-3.8和mypy==0.800

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-22 21:34:12

如果希望该字段的类型是int的函数或str的函数,则可以这样做。

代码语言:javascript
复制
class Config(NamedTuple):
    func: Callable[[int], int] | Callable[[str], int]

这描述了两种函数类型的联合。

但是,这不是一种有用的类型。如果Python有交集类型,这将相当于

代码语言:javascript
复制
Callable[[int & str], int]

int & str是,嗯,空类型。不存在同时为intstr的值。因此,这是一种永远无法调用的函数类型。isinstance不会在这里帮助您,因为您不能键入Callable声明的参数类型。

正如注释中提到的,您可以

代码语言:javascript
复制
Callable[[int | str], int]

但这是接受int或字符串的函数类型,而不是只接受这两个函数中的一个的函数类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71579055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档