Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何键入字符串的注释长度?_Python_Python 3.x - Fatal编程技术网

Python 如何键入字符串的注释长度?

Python 如何键入字符串的注释长度?,python,python-3.x,Python,Python 3.x,我想对python中只接受单个字符的函数进行类型注释,例如: (s:str)->int 由于Python没有单个字符的类型,因此不能只执行(s:char)->int之类的操作 有没有办法键入s:str只能是一个字符? 在编写代码时,我可以看到这在暗示方面很有用 以下是我的完整示例: 导入Unicode数据 罗马数字查找={“I”:1,“V”:5,“X”:10,…} def精确罗马数字(s:str)->int: “”“返回单个罗马数字的值。不支持多字符罗马数字,如'XII'或撇号。”“” #将Un

我想对python中只接受单个字符的函数进行类型注释,例如:
(s:str)->int

由于Python没有单个字符的类型,因此不能只执行
(s:char)->int
之类的操作

有没有办法键入
s:str
只能是一个字符?

在编写代码时,我可以看到这在暗示方面很有用

以下是我的完整示例:

导入Unicode数据
罗马数字查找={“I”:1,“V”:5,“X”:10,…}
def精确罗马数字(s:str)->int:
“”“返回单个罗马数字的值。不支持多字符罗马数字,如'XII'或撇号。”“”
#将Unicode罗马数字转换为其标准化文本版本。e、 g.Ⅹ->X,ⅰ -> 我
s=unicodedata.normalize(“NFKC”,s).upper()
如果是罗马数字查找:
返回罗马数字查找[s]
else:#某种形式的无效值。
如果不存在(s、str):
raise TypeError(“参数的类型必须为str.”)
艾利夫·伦(s)!=1:
raise VALUE ERROR(“必须是单个罗马数字”)
其他:
raise VALUE ERROR(“不是有效/受支持的罗马数字”)

(我知道错误不是最好的)

理论上,类型注释不应该像您希望的那样使用-这意味着,代码中的每个约束都不应该用类型注释来表示

现在,为了回答您的问题,您当然可以构建自己的类型注释,但在我看来,这将是太多的工作导致太少的结果

有两种方法描述如何定义自定义注释

您可以在任何时候:

  • 在docstring中描述变量的长度应为1个字符
  • 进行健全性/有效性检查,并提出适当的异常
  • 使用类似的方法清理/序列化数据

,但由于python类型是纯语义的,所以您可以自己创建。因为字符串的长度不是其类型的一部分,所以这实际上是不可能的。即使你在语法上描述了它,我也不认为你能在编译时对它进行打字检查。这里有更多关于Python类型的内容:这里(节略)人们对类型注释的期望太高了。并非程序中的每个约束都可以或应该用类型注释来表示。Python 3+字符串默认为unicode,unicode字符串的长度在某些情况下可能不明确。我不认为注释字符串的长度与注释元组/列表的子类型有太大的不同(
tuple[int,int,str]
). 显然,目前没有自定义类型是无法实现的,但是像
str[3]
这样的东西对我来说似乎足够简单。像这样的东西是怎么回事?不管怎样,谢谢你的回答。@GoodClover常量泛型和类型泛型是不同的东西,你想要的并不像听起来那么简单。您不能参数化
str
,因为它不是通用容器。