Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

SyntaxError при чтении атрибутов константного числа

#python


Такой код:

1.real


выведет

  File "", line 1
    1.real
         ^
SyntaxError: invalid syntax




Но такой код:

var = 1
var.real

int('1').real

getattr(1, 'real')


отработает нормально



Cо строкой все работает ожидаемо:

's'.islower()




В чем проблема? Почему читать атрибуты у константного числа можно только через костили,
и нельзя по нормальному?

P.S: Я не смог найти каких либо  статей/вопросов по этому поводу.
    


Ответы

Ответ 1



Разбирая такое выражение, 1.real интерпретатор, увидев после единицы точку, ожидает, что это вещественное число, после которого ни с того ни с сего идёт слово real. Возникает синтаксическая ошибка. Например, в следующих выражениях нет двойственности, и ошибки не возникает: 1..real // 1.0 1.0.real // 1.0 1 .real // 1 (1).real // 1 Источник

Ответ 2



Просто пробел добавьте: >>> 1 .real 1 Вариант с пробелом распознаётся как обращение к атрибуту целого числа: $ python -m tokenize -e <<<'1 .real' 1,0-1,1: NUMBER '1' 1,2-1,3: DOT '.' 1,3-1,7: NAME 'real' 1,7-1,8: NEWLINE '\n' 2,0-2,0: ENDMARKER '' Вариант без пробела распознаётся как число, за которым сразу имя идёт : $ python -m tokenize -e <<<'1.real' 1,0-1,2: NUMBER '1.' 1,2-1,6: NAME 'real' 1,6-1,7: NEWLINE '\n' 2,0-2,0: ENDMARKER '' Последнее является синтаксической ошибкой в Питоне: >>> import ast >>> ast.parse('1.real') Traceback (most recent call last): ... File "", line 1 1.real ^ SyntaxError: invalid syntax С пробелом нет ошибки: >>> ast.dump(ast.parse('1 .real', 'eval').body[0]) "Expr(value=Attribute(value=Num(n=1), attr='real', ctx=Load()))"

Комментариев нет:

Отправить комментарий