我刚刚发现int('1_34')
不会因为PEP 515而引发错误。但是我想抛出一个错误。有没有更严格的方法可以将字符串解析为int
(也可以是float
)来避免这种情况?
答案 0 :(得分:2)
您可以检查字符串是否包含下划线,如果包含下划线,则引发异常。
这是一个例子:
s = "1_34"
if "_" in s:
raise ValueError("string contains an underscore")
else:
x = int(s)
对于s = "1_34"
,您将获得:
ValueError: string contains an underscore
对于s = "134"
,您将拥有x = 134
。
答案 1 :(得分:0)
def number(n):
if n.isdigit():
return int(n)
elif n.count(".") == 1 and n.replace(".", "").isdigit():
return float(n)
else:
raise ValueError("Not a number!")
print(number("345"))
print(number("34.5"))
print(number("1_34"))
这是最干净的方法。
答案 2 :(得分:0)
如果您要弄脏手,可以使用自己的继承builtin
:
class Int(int):
def __init__(self, value):
if '_' in value:
raise ValueError("PEP 515 revoked - underscores not allowed")
else:
super().__init__()
如果您确实对PEP 515毫无用处,那么甚至可以隐藏内置的int
:
int = Int
# you can always back up the builtin first...
# _int = int
有些人可能不同意这个答案...