繁体   English   中英

Python 类型提示大写和小写字符串?

[英]Python type hinting for upper vs lower-cased strings?

在 Python 中,如果我正在创建一个字符串列表,我会输入如下提示:

from typing import List
list_of_strings : List[str] = []
list_of_strings.append('some string')
list_of_strings.append('some other string')

有什么方法可以输入提示字符串的预期大小写吗? 这样,当我编写比较运算符来搜索特定字符串时,例如,我不会意外搜索我知道将是小写的字符串的混合或大写版本,因为 list_of_strings 中的所有字符串都应该是小写。 我意识到我可以添加评论并返回列表的声明,但我想知道是否有更集成的方法来做到这一点。

解决此问题的另一种方法是创建一个 class 扩展 str 并拒绝任何不正确大小写的值,然后为该 class 键入提示。 除了创建比简单的字符串更痛苦之外,还有什么理由说明这是一个坏主意吗?

我遇到这个问题的原因是我创建了列表、字典和其他结构来存储数据,然后需要添加或搜索它们以查找特定的键/值,并且不知道预期的情况会在我添加重复条目时产生问题因为 string_list 中的一个简单if 'example' in string_list没有找到它。 并且在if 'example'.upper() in string_list很容易忘记并且不是很漂亮。 在声明(如果我在那里写了描述预期情况的评论)和我正在编码的地方来回跳转会分散我的流程,当我稍后引用 object 时,如果有这些信息会很好。

您可以在 Python 3.10 中使用typing.TypeGuard

from typing import TypeGuard


class LowerStr(str):
    '''a dummy subclass of str, not actually used at runtime'''


def is_lower_str(val: str) -> TypeGuard[LowerStr]:
    return val.islower()


l: list[LowerStr] = []


def append(lst: list[LowerStr], v: str):
    if not is_lower_str(v):
        raise TypeError('oh no')
    lst.append(v)

您确实可以使用str的子类来强制执行运行时安全。 缺点主要是性能。 您需要注意不要添加不必要的__dict__ ,方法是从我的脑海中将__slots__ = ()添加到 class 定义中。

无论哪种方式,字符串文字都不会被自动验证,因此它会导致一些开销,要么调用类型保护,将它们传递给子类型的构造函数,要么使用cast(LowerStr, 'myliteral')

不,我一直在网上搜索这个,但它不存在。

Python 的typing模块不提供任何小写或大写str的提示。


[...] 类型提示字符串的预期大小写

请记住, type例如是str ,在这种情况下,您应该谈论hint而不是type hint


无论如何,您都可以在此 scope 中创建自定义 class:

class UppercaseString(str): pass

UppercaseString将继承内置 class str的所有功能(当您指定时会发生这种情况: pass class声明)。

无论如何,您都可以创建一个instancemethod来检查字符串是否真的是大写,否则会引发错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM