#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()))"
Комментариев нет:
Отправить комментарий