gpt4 book ai didi

python - Sage 的 "var"是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:58 24 4
gpt4 key购买 nike

在尝试创建类似于 Sage 的 Python 函数时的 var()function(),我在 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 的话:

In src/setup.py we set

Cython.Compiler.Options.old_style_globals = True

which causes Cython to fall back to the old behavior.

关于python - Sage 的 "var"是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21388829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com