Python3 interp中方法和类的位置

2024-10-02 18:19:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我们的教授今天告诉我们可以建立一个迭代器

class IteratorExample:
    def __init__(self, n):
       pass

    def __iter__(self):
        return self

    def __next__(self):
        if cond:
            pass
        else:
            raise StopIteration

当我们使用它时,比如在iteratorExample中的i中,解释器将调用iter(self)和next(self)方法。我的问题是:

  1. 如果我打开C:\Python文件夹-在哪里可以看到调用这些方法的代码?你知道吗
  2. 在python文件夹中,我在哪里可以看到其他内置方法(如len()或int())的代码?你知道吗

Tags: 方法代码self文件夹returnifinitdef
2条回答

您可以查看Python字节码反汇编,以了解for-loop是如何在Python中实现的:

>>> import dis
>>> dis.dis('for x in it: pass')
  1           0 SETUP_LOOP              14 (to 17)
              3 LOAD_NAME                0 (it)
              6 GET_ITER
        >>    7 FOR_ITER                 6 (to 16)
             10 STORE_NAME               1 (x)
             13 JUMP_ABSOLUTE            7
        >>   16 POP_BLOCK
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE

即使不看源代码,我们也可以猜测__iter__是由GET_ITER操作码调用的,而__next__是在FOR_ITER中调用的。你知道吗

事实上,CPython的Python/ceval.c证实了这一点,例如GET_ITER调用^{},它等价于iter(iterable)可以调用iterable.__iter__()方法。你知道吗


In the python folder, where can I see the code of other built-in methods (like len(), or int()?

这些函数也用C语言实现(在CPython中)。你可以在CPython source repository中看到它们。你知道吗

内置方法来自在Python/bltinmodule.c e.g., ^{}调用^{}中实现的builtins模块。你知道吗

int是Python中整数的类。它是在Objects/longobject.c(python3)中实现的。你知道吗


Isn't the CPython code in the Python folder?

否。Python安装文件夹不包含CPython的源代码。它可能包含标准库中的纯Python模块,例如Lib/fractions.py,除非它们是压缩的,或者只安装了.pyc.pyo文件等编译模块。你知道吗

要获取完整的源代码,请运行:

$ hg clone https://hg.python.org/cpython

其中hgMercurial executable。你知道吗

作为练习,您可以找到其他Python implementations如Pypy、Jython定义GET_ITERFOR_ITERlen()int()的位置。你知道吗

你要求的是Python内置的行为。尤其是您使用的是用C编写的Python解释器,它通常被称为CPython。您可以找到CPython here的源代码,尽管要找到执行len()int()和迭代器协议的确切代码需要一些时间。你知道吗

相关问题 更多 >