python – Sage的“var”如何工作?
发布时间:2020-12-20 13:40:02 所属栏目:Python 来源:网络整理
导读:在尝试创建类似于 Sage的var()或function()的Python函数时,我在Python中遇到了一个明显不那么重要的问题.本质上,在Sage中调用var(‘x’)不仅返回Sage符号表达式,而且相当于x = SR.var(‘x’),即它将表达式对象赋值给当前全局命名空间中的变量(调用模块的命名
在尝试创建类似于
Sage的var()或function()的Python函数时,我在Python中遇到了一个明显不那么重要的问题.本质上,在Sage中调用var(‘x’)不仅返回Sage符号表达式,而且相当于x = SR.var(‘x’),即它将表达式对象赋值给当前全局命名空间中的变量(调用模块的命名空间).
我的问题是,它是如何做到的?如果我做这样的事情: 在B.py: def func(): globals()['x'] = something 在A.py from B import func func() 我只能影响模块B的全局命名空间中的变量,而不是调用模块A的全局命名空间. 然而,与我的Sage版本一起分发的文件var.pyx如下所示: ... def var(*args,**kwds): if len(args)==1: name = args[0] else: name = args G = globals() # this is the reason the code must be in Cython. if 'ns' in kwds: # ... # not relevant v = SR.var(name,**kwds) if isinstance(v,tuple): for x in v: G[repr(x)] = x else: G[repr(v)] = v return v ... 特别是关于Cython的评论似乎很有趣.我对Cython知之甚少,所以也许这就是我的问题.如果这是Cython的一些特殊方面,那么如何在“常规Python”/ CPython中复制此函数呢? PS:是的,我意识到一般来说,这种行为是一个坏主意.我主要是出于好奇而问. 解决方法
解释发现于
https://groups.google.com/d/topic/sage-devel/J-kDHlnT4/discussion
我引用Volker Braun:
Cython.Compiler.Options.old_style_globals = True
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |