python中dot函数_什么是python ..(“dot dot”)符号语法?

这个问题已经得到了充分的回答(即@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__直接操作你没有这些回退反向操作被调用。这种“预期行为”的丧失是你(通常)不应该直接使用魔法的主要原因。

你可能感兴趣的:(python中dot函数)