Разобрать строку в int, не найдя подчеркивания - PullRequest
0 голосов
/ 04 декабря 2018

Я только что обнаружил, что int('1_34') не выдаст ошибку из-за PEP 515 .Но я хотел бы, чтобы это выдало ошибку.Есть ли более строгий способ разбора строк на int с (и float с тоже), который бы этого избегал?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018
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"))

Имо, это самый чистый подход.

0 голосов
/ 04 декабря 2018

Если вы хотите испачкать свои руки, вы можете унаследовать builtin со своими собственными:

class Int(int):
    def __init__(self, value):
        if '_' in value:
            raise ValueError("PEP 515 revoked - underscores not allowed")
        else:
            super().__init__()

И затем даже можете затенить встроенный int, если вы действительно не используете PEP 515:

int = Int
# you can always back up the builtin first...
# _int = int

Некоторые могут не одобрить этот ответ ...

0 голосов
/ 04 декабря 2018

Вы можете проверить, содержит ли строка подчеркивание, и вызвать исключение, если оно есть.

Вот пример:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...