标签: cpython

IronPython可以作为CPython的替代品吗?

IronPython是否已经达到了这样的程度,你可以放弃它作为CPython的替代品?

澄清:我的意思是IronPython可以运行最初为CPython编写的应用程序(当然不涉及.NET)

python ironpython dynamic-language-runtime cpython

4
推荐指数
1
解决办法
548
查看次数

CPython中的__builtin__模块在哪里?

我想获取__builtin__模块的路径和源代码,我在哪里可以得到它?

python cpython

4
推荐指数
1
解决办法
444
查看次数

Python:模块全局变量的生命周期

我有一个初始化成本高的共享资源,因此我希望在整个系统中访问它(它基本上用于某些仪器,因此必须重量轻).所以我创建了一个管理设置和访问权限的模块.它执行资源的惰性初始化并将其存储在模块全局变量中.然后,我在整个系统中使用此模块的功能来操作资源.
- 现在我想知道是否(或多久)我将不得不重新初始化资源?
- 我知道对象是在CPython上(或更好地)零引用计数时收集的垃圾,但是存储在计为引用的模块中,即使此时模块没有被执行?

代码示例:这里我们有模块,其中_connect()很慢.我想在我的系统中使用report_safely()并最终尽可能少地调用_connect().

__metrics = None


def _connect():
    global __metrics

    client = SomeSlowToSetUpClient()
    __metrics = SomeMetrics(client)
    client.connect()


def report_safely():
       if not __metrics:
           _connect()

       __metrics.execute_lightweight_code()
Run Code Online (Sandbox Code Playgroud)

python lifecycle global cpython

4
推荐指数
1
解决办法
2538
查看次数

Python:列表中的Nan是否相等?

我只是想弄清楚这些结果背后的逻辑:

>>>nan = float('nan')
>>>nan == nan
False 
# I understand that this is because the __eq__ method is defined this way
>>>nan in [nan]
True 
# This is because the __contains__ method for list is defined to compare the identity first then the content?
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下,我认为在幕后这个功能PyObject_RichCompareBool被称为正确?为什么会有区别?他们不应该有相同的行为吗?

python cpython python-internals

4
推荐指数
1
解决办法
494
查看次数

是否有必要先设置__all__然后使用下划线呢?

我一直在阅读cpython HTTP包的源代码,以获取乐趣和收益,并注意到在server.py中,他们__all__设置了变量,但对函数也使用了下划线_quote_html(html)

这不是多余的吗?两者都不能限制进口的商品from HTTP import *吗?

他们为什么两者都做?

python cpython

4
推荐指数
2
解决办法
159
查看次数

当对原始类型变量执行"="时,CPython实际上做了什么?

例如:

a = some_process_that_generates_integer_result()
b = a
Run Code Online (Sandbox Code Playgroud)

有人告诉我,ba将指向同一块整数对象,因此b将修改该对象的引用计数.代码PyObject* ast2obj_expr(void* _o)Python-ast.c中执行:

static PyObject* ast2obj_object(void *o)
{
    if (!o)
        o = Py_None;
    Py_INCREF((PyObject*)o);
    return (PyObject*)o;
}

......

case Num_kind:
    result = PyType_GenericNew(Num_type, NULL, NULL);
    if (!result) goto failed;
    value = ast2obj_object(o->v.Num.n);
    if (!value) goto failed;
    if (PyObject_SetAttrString(result, "n", value) == -1)
            goto failed;
    Py_DECREF(value);
    break;
Run Code Online (Sandbox Code Playgroud)

但是,我认为修改引用计数而不更改所有权实际上是徒劳的.我期望的是每个包含原始值(浮点数,整数等)的变量总是有自己的值,而不是引用同一个对象.

在执行我的简单测试代码时,我发现上面的Num_kind分支中的断点永远不会到达:

def some_function(x, y):
    return (x+y)*?x-y)

a = some_function(666666,66666)
print a

b = a …
Run Code Online (Sandbox Code Playgroud)

python cpython reference-counting

4
推荐指数
1
解决办法
145
查看次数

在python中重命名elif

我最近玩了一些在python中添加一些可选语句名称,并且工作正常,直到我进入if语句并且我为else和elif添加了一个可选名称:

if_stmt = 'if' test ':' suite ('elif' test ':'suite)* ['else' ':' suite] |  'wenn' test ':' suite ('andernfalls' test ':'suite)* ['sonst' ':' suite]
Run Code Online (Sandbox Code Playgroud)

然后它编译没有错误,但当我用wenn和andernfalls运行测试时,解释器抛出了错误:

SystemError: unexpected token in 'if' statement: andernfalls 
Run Code Online (Sandbox Code Playgroud)

而我所做的每一个加法都很有效.那么为什么我不能添加其他和elif,我该怎么办?

我正在修改python网站上最新的python 2.7代码

编辑我的测试代码是:

x = 1
y = 2
wenn x > y:
    print 1
andernfalls x < y:
    print 2
sonst:
    print 3
Run Code Online (Sandbox Code Playgroud)

我在顶部添加行的文件是python源代码的Grammar目录中的语法文件

python grammar cpython python-2.7

4
推荐指数
1
解决办法
186
查看次数

CPython的解释器如何知道打印最后一个表达式的结果?

我一直在挖掘源代码,以弄清楚打印结果的哪一点.例如:

>>> x = 1
>>> x + 2
3
Run Code Online (Sandbox Code Playgroud)

以上两个陈述编译为:

  1           0 LOAD_CONST               0 (1)
              3 STORE_NAME               0 (x)
              6 LOAD_CONST               1 (None)
              9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (2)
              6 BINARY_ADD
              7 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

第一个语句不打印任何内容,因为None它是返回的值.第二个返回添加的结果.

CPython的交互式循环调用PyRun_InteractiveOneObjectEx()每个输入.这将获取AST并调用run_mod()将AST编译为字节代码,然后在虚拟机中评估结果.获取的返回Python对象PyRun_InteractiveOneObjectEx()只是VM堆栈顶部.

到目前为止,所有这些都是我所期待的.但后来返回的值似乎被抛弃了!什么时候由REPL打印?

顺便说一句,我可以看到交互模式确实改变了标记器; 它invokes PyOS_Readline带有sys.ps1提示(">>> "默认情况下).我检查了类似的变化pythonrun.c,但没有运气.

python cpython python-internals

4
推荐指数
1
解决办法
88
查看次数

如何从PyListObject中"pop"元素?

让我说我有一个PyListObject,我想附加一个PyObject然后我可以使用PyList_Append记录在其中的API List Objects C-API.但是对于我的用例,我想要pop一个元素PyListObject(即my_list.pop()在python层中).

但是List Objects C-API文档没有提到有关pop操作的任何内容.

那么有关于PyListPopAPI函数的文档吗?

python cpython list python-c-api python-3.x

4
推荐指数
1
解决办法
201
查看次数

为什么`is`运算符在脚本中的行为与REPL不同?

在python中,两个代码具有不同的结果:

a = 300
b = 300
print (a==b)
print (a is b)      ## print True
print ("id(a) = %d, id(b) = %d"%(id(a), id(b))) ## They have same address
Run Code Online (Sandbox Code Playgroud)

但是在外壳模式(交互模式)下:

>>> a = 300
>>> b = 300
>>> a is b
False
>>> id(a)
4501364368
>>> id(b)
4501362224
Run Code Online (Sandbox Code Playgroud)

“是”运算符具有不同的结果。

python cpython

4
推荐指数
2
解决办法
130
查看次数