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

这个问题已经得到了充分的回答(即@Paul Rooney的答案),但是也可以validation这些答案的正确性。

让我回顾一下现有的答案: ..不是一个单一的语法元素!

您可以检查源代码是如何“标记化”的 。 这些令牌表示如何解释代码:

>>> 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__'), ...]

所以string1.被解释为数字,第二个. 是一个OP(一个操作符,在这个例子中是“get attribute”操作符), __truediv__是方法名。 所以这只是访问float 1.0的__truediv__方法。

查看生成的字节码的另一种方法是dis它。 这实际上显示了执行某些代码时执行的指令:

>>> 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__ 。

关于你的问题

你怎么能用更复杂的语句(如果可能的话)?

尽pipe有可能你不应该这样写代码,只是因为不清楚代码在做什么。 所以请不要在更复杂的语句中使用它。 我甚至可以走得这么远,以至于你不应该在如此“简单”的陈述中使用它,至less你应该用括号来分隔指令:

f = (1.).__truediv__

这将会更加可读 – 但是可以这样理解:

from functools import partial from operator import truediv f = partial(truediv, 1.0)

会更好!

使用partial的方法也保留了python的数据模型 ( 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__上__truediv__ 。 这种“预期行为”的损失是你(通常)不应该直接使用魔法的主要原因。

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