有没有一个PEP484类型提示可以用于“字符”?

12
简而言之:是否有一个Python类型提示可以表示长度为1的“字符”,而不使用类型提示“str”?
我最近看到chr被用于这个目的,除了直觉外,我找不到任何证据来证明或否定这是适当的。它显然是有效的Python语法。例如:
>>> def foo(c: chr):
...   pass
... 
>>> foo('a')
>>> 

这引出了更多问题,而非解答问题:因为chr是可调用的,所有类型都可以被它们的构造函数“调用”,所以它是否被认为是一个有效的类型提示?看起来不是这样——一些快速实验表明,Python 实际上会接受任何定义好的符号作为类型提示,而不管它是否有意义。


2
不行,因为那不是一种类型。使用 chr 是错误的,因为那肯定不是一种类型。 - juanpa.arrivillaga
5
没有字符类型。长度为一的字符串仍然是字符串。 - wim
1
你在哪里看到的?这可能是自定义类型。 - Selcuk
7
@Reinderien提供的是“提示”,供第三方使用。例如,如果您需要静态类型检查,则需要像“mypy”这样的工具。请注意,并没有改变原文的意思。 - juanpa.arrivillaga
1
相关链接:https://github.com/python/mypy/issues/4334 - mkrieger1
显示剩余6条评论
1个回答

1

我建议使用以下其中一种方法,几乎所有方法都与typing模块的使用有关:

  • 如果您已经知道用户可以传递哪些字母,则最好的方法是使用typing.Literal对象。我强烈建议学习文档中的示例-查看文档。请注意,在所有可能的值都事先知道的情况下才应使用此提示(再次查看示例);

  • 如果没有这样的知识-例如,任何单个字符都可以使用,则同样好的方法是使用typing.TypeVar-查看文档。可以进行以下操作:

import typing

char = typing.TypeVar("char", str)


def foo(c: char) -> ...:
    # TODO


此外,在定义 char 时,不要忘记将 str 作为参数。这意味着 char 可以是 str 的任何子类型。
最后,自然的注释 str 永远不会失败。只需在文档字符串中指定预期的参数为单个字符即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接