IronPython是否已经达到了这样的程度,你可以放弃它作为CPython的替代品?
澄清:我的意思是IronPython可以运行最初为CPython编写的应用程序(当然不涉及.NET)
我有一个初始化成本高的共享资源,因此我希望在整个系统中访问它(它基本上用于某些仪器,因此必须重量轻).所以我创建了一个管理设置和访问权限的模块.它执行资源的惰性初始化并将其存储在模块全局变量中.然后,我在整个系统中使用此模块的功能来操作资源.
- 现在我想知道是否(或多久)我将不得不重新初始化资源?
- 我知道对象是在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) 我只是想弄清楚这些结果背后的逻辑:
>>>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被称为正确?为什么会有区别?他们不应该有相同的行为吗?
我一直在阅读cpython HTTP包的源代码,以获取乐趣和收益,并注意到在server.py中,他们__all__设置了变量,但对函数也使用了下划线_quote_html(html)。
这不是多余的吗?两者都不能限制进口的商品from HTTP import *吗?
他们为什么两者都做?
例如:
a = some_process_that_generates_integer_result()
b = a
Run Code Online (Sandbox Code Playgroud)
有人告诉我,b和a将指向同一块整数对象,因此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中添加一些可选语句名称,并且工作正常,直到我进入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目录中的语法文件
我一直在挖掘源代码,以弄清楚打印结果的哪一点.例如:
>>> 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,但没有运气.
让我说我有一个PyListObject,我想附加一个PyObject然后我可以使用PyList_Append记录在其中的API List Objects C-API.但是对于我的用例,我想要pop一个元素PyListObject(即my_list.pop()在python层中).
但是List Objects C-API文档没有提到有关pop操作的任何内容.
那么有关于PyListPopAPI函数的文档吗?
在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)
“是”运算符具有不同的结果。
cpython ×10
python ×10
global ×1
grammar ×1
ironpython ×1
lifecycle ×1
list ×1
python-2.7 ×1
python-3.x ×1
python-c-api ×1