这个问题已经得到了充分的回答(即@Paul Rooneys回答),但也可以验证这些答案的正确性。
让我回顾一下现有答案:..不是单个语法元素!
您可以检查源代码是如何"tokenized"的。这些标记表示代码的解释方式:
>>> from tokenize import tokenize
>>> from io import BytesIO
>>> s = "1..__truediv__"
>>> list(tokenize(BytesIO(s.encode('utf-8')).readline))
[...
TokenInfo(type=2 (NUMBER), string='1.', start=(1, 0), end=(1, 2), line='1..__truediv__'),
TokenInfo(type=53 (OP), string='.', start=(1, 2), end=(1, 3), line='1..__truediv__'),
TokenInfo(type=1 (NAME), string='__truediv__', start=(1, 3), end=(1, 14), line='1..__truediv__'),
...]因此字符串1.被解释为数字,第二.是OP(运营商,在这种情况下,“获取属性”操作)和__truediv__是方法名。所以这只是访问浮动1.0的__truediv__方法。
查看生成的字节码的另一种方法是disassemble。这实际上显示了执行某些代码时执行的指令:
>>> import dis
>>> def f():
... return 1..__truediv__
>>> dis.dis(f)
4 0 LOAD_CONST 1 (1.0)
3 LOAD_ATTR 0 (__truediv__)
6 RETURN_VALUE基本上说的一样。它加载常量1.0的属性__truediv__。
关于你的问题
And how can you use it in a more complex statement (if possible)?
尽管有可能你永远不应该编写这样的代码,只是因为它不清楚代码在做什么。所以请不要在更复杂的陈述中使用它。我甚至会走得太远,你不应该在如此“简单”的陈述中使用它,至少你应该使用括号来分离指令:
f = (1.).__truediv__这肯定会更具可读性 - 但有些内容如下:
from functools import partial
from operator import truediv
f = partial(truediv, 1.0)会更好!
该方法使用partial还保留python's data model(在1..__truediv__方法不!),它可以通过这个小片段来证明:
>>> f1 = 1..__truediv__
>>> f2 = partial(truediv, 1.)
>>> f2(1+2j) # reciprocal of complex number - works
(0.2-0.4j)
>>> f2('a') # reciprocal of string should raise an exception
TypeError: unsupported operand type(s) for /: 'float' and 'str'
>>> f1(1+2j) # reciprocal of complex number - works but gives an unexpected result
NotImplemented
>>> f1('a') # reciprocal of string should raise an exception but it doesn't
NotImplemented这是因为1. / (1+2j)不是由float.__truediv__但complex.__rtruediv__评估 - operator.truediv确保在正常运行时返回NotImplemented但是当你在__truediv__直接操作你没有这些回退反向操作被调用。这种“预期行为”的丧失是你(通常)不应该直接使用魔法的主要原因。