问题已经得到充分回答(即@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(一个运算符,在本例中是“get attribute”运算符),__truediv__ 是方法名。所以这只是访问浮动1.0的__truediv__方法。
查看生成的字节码的另一种方式是to 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__。
关于你的问题
你如何在更复杂的语句中使用它(如果可能的话)?
即使您可能永远不应该编写这样的代码,只是因为不清楚代码在做什么。所以请不要在更复杂的语句中使用它。我什至会说你不应该在如此“简单”的语句中使用它,至少你应该使用括号来分隔说明:
f = (1.).__truediv__
这无疑更具可读性 - 但类似于:
from functools import partial
from operator import truediv
f = partial(truediv, 1.0)
会更好!
使用partial 的方法还保留了python's data model(1..__truediv__ 方法没有!)这可以通过这个小sn-p 来演示:
>>> 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__。这种“预期行为”的损失是您(通常)不应该直接使用魔术方法的主要原因。