加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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:

In src/setup.py we set

Cython.Compiler.Options.old_style_globals = True

which causes Cython to fall back to the old behavior.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读