[英]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
声明)。
无论如何,您都可以创建一个instance
的method
来检查字符串是否真的是大写,否则会引发错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.