Почему не работает выражение литерал.метод()?
Как я понял, что все данные в языке Python представлены в виде объектов, а объекты создаются, в том числе с помощью литералов. Таким образом, 1 — это литерал объекта класса int:
>>> type(1)
<class 'int'>
Потом я решил посмотреть методы этого объекта:
>>> dir(1)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
Когда я решил использовать метод bit_length, получил ошибку:
>>> 1.bit_length()
File "<stdin>", line 1
1.bit_length()
^
SyntaxError: invalid syntax
Почему?
Ответы (1 шт):
Потому, что синтаксический анализатор ожидает в этом случае дробную часть числа после точки и воспринимает точку как десятичный разделитель. Это можно обойти, воспользовавшись скобками:
In [21]: (1).bit_length()
Out[21]: 1
или поставив пробел после числа:
In [26]: 1 .bit_length()
Out[26]: 1
Для справки - похожая конструкция работает для вещественных чисел, т.к. второй точки в числе быть не может и анализатор может однозначно определить, что после второй точки идет вызов метода литерала типа float:
In [22]: 1.23.is_integer()
Out[22]: False