在尝试创建类似于Sage的
我只能影响模块
然而,我的Sage版本分发的文件
特别是有关Cython的评论似乎很有趣。我对Cython不太了解,所以可能是我的问题。如果这是Cython的某个特殊方面,那么如何在“常规Python”/CPython中复制此函数呢?
PS:是的,我意识到通常这样的行为是一个坏主意。我主要是出于好奇问的。
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:是的,我意识到通常这样的行为是一个坏主意。我主要是出于好奇问的。