【发布时间】:2018-12-04 16:57:10
【问题描述】:
我刚刚发现int('1_34')不会因为PEP 515而抛出错误。但我希望它抛出一个错误。是否有更严格的方式将字符串解析为ints(以及floats)可以避免这种情况?
【问题讨论】:
标签: python python-3.x string int
我刚刚发现int('1_34')不会因为PEP 515而抛出错误。但我希望它抛出一个错误。是否有更严格的方式将字符串解析为ints(以及floats)可以避免这种情况?
【问题讨论】:
标签: python python-3.x string int
您可以检查字符串是否包含下划线,如果包含则引发异常。
这是一个例子:
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。
【讨论】:
int 的唯一参数是转换为 int 和要使用的基数。将它包装在一个函数中可能是最接近的事情
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"))
Imo 这是最干净的方法。
【讨论】:
如果你想弄脏你的手,你可以用你自己的继承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
有些人可能不赞成这个答案...
【讨论】: