python语法是什么意思-什么是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__直接操作你没有这些回退反向操作被调用。这种“预期行为”的丧失是你(通常)不应该直接使用魔法的主要原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值