python-3.x 如何输入注解字符串长度?

huwehgph  于 2022-12-15  发布在  Python
关注(0)|答案(2)|浏览(164)

我想在Python中输入注解一个只接受单个字符的函数,举个例子:(s: str) -> int
因为Python没有一个字符的类型,所以你不能只做(s: char) -> int这样的事情。

是否可以键入s: str仅为一个字符?

我可以看到这在编写代码时的提示中很有用。
下面是我的完整示例:

import unicodedata

roman_numeral_lookup = {"I": 1, "V": 5, "X": 10, ...}

def exact_roman_numeral(s: str) -> int:
    """Return the value of a single Roman numeral. Dosen't support multicharacter roman numerals such as 'XII' or Apostrophus."""

    # Convert Unicode Roman numerals into to their normalised text version. e.g. Ⅹ -> X, ⅰ -> I
    s = unicodedata.normalize("NFKC", s).upper()

    if s in roman_numeral_lookup:
        return roman_numeral_lookup[s]

    else:  # Some form of invalid value.
        if not isinstance(s, str):
            raise TypeError("Argument must be of type str.")
        elif len(s) != 1:
            raise ValueError("Must be a single Roman numeral.")
        else:
            raise ValueError("Not a valid/supported Roman numeral.")

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

i34xakig

i34xakig1#

从理论上讲,类型注解不应该像您希望的那样使用,也就是说,代码中的每个约束都不应该用类型注解来表示。
现在,为了回答您的问题,您当然可以构建自己的类型注解,但是,我认为,这样做工作量太大,结果太少。
other answers on SO描述了如何定义自定义注解
您可以随时:

  • 在文档字符串中说明变量应该是1个字符长
  • 执行健全性/验证检查并引发适当的异常。
  • 使用类似Marshmallow的东西来净化/序列化数据
vngu2lb8

vngu2lb82#

我认为你可以使用Literal[],像Literal['I','V','X',...]这样的内部键,它会占用更多的字符,但我认为它很好,如果你懒得输入,你可以使用列表解包,像Literal[*keys]

相关问题