1

上下文: 我想用另一个对象替换一个对象:

x = []
r = [2]
replace(x, r)
assert x == [2]
assert x is r

在 Smalltalk 中,这将被称为become.

问题: 我该怎么做?我需要创建一个 C 扩展还是已经有这样的东西?

我试过: 这个但是我需要处理这么多的情况。只需更改指针后面的对象对我来说就足够了。

原因:我想实现功能、改进和主题等扩展。有时我无法更改内置对象的类os.__class__ = X以实现更大的灵活性。由于我不能这样做,我想更换。

具体用法示例:

主观看法:

import pylung
pylung.deutsch()

import os # I want to preserve object identity with the original os

os.ERREICHE_SETZEN
os.durchlaufe(...)

翻译:

import os
import pylung

os = pylung.translate(os, 'deutsch') # German

@os.walk
def durchlaufe(ordner, oben_nach_unten, folge_links):
    """Ordner baum erzeuger
"""
4

4 回答 4

4

一个简单=的做你想要的:

x = []
r = [2]
x = r
assert x == [2]
assert x == r
assert x is r
于 2013-05-31T13:21:35.300 回答
3

如果你想能够做到这一点......

import pylung
pylung.deutsch()

import os # I want to preserve object identity with the original os

os.ERREICHE_SETZEN
os.durchlaufe(...)

...并保持与现有库的兼容性(将使用英文名称),向os模块添加其他属性可能最简单,而不是替换它们。例如...

# pylung.py
def deutsch():
    import os
    os.durchlaufe = os.walk
    # etc...

...如果您还想翻译模块名称,请说collectionsto kollektionen,您可以执行以下操作...

# pylung.py
import sys

def deutsch():
    import os
    os.durchlaufe = os.walk
    # etc...
    import collections
    sys.modules['kollektionen'] = sys.modules['collections']

...再次,确保您保留原始模块名称以保持兼容性。

您还可以查看使用自定义导入挂钩来按需进行模块翻译,因此您只需替换脚本中实际使用的符号。

于 2013-05-31T13:56:06.790 回答
2

在 Python 中,本机执行此操作的唯一方法是通过赋值:

x = []
r = [2]
x = r
assert x == [2]
assert x is r

但是,这太微不足道了,我怀疑它是您正在寻找的东西。您更有可能希望更新所有引用r。这在 Python 中是不可能的。您可以通过切片分配以某种方式完成此操作,但这实际上不会更改对象身份,因此您的最后一个assert将失败,而且这只适用于某些类型,例如列表(尽管其他一些容器类型具有类似的功能; 例如,dict你可以.clear()使用.update())。

x = []
r = [2]
x[:] = r
assert x == [2]
assert x is r     # fails

最接近的可能是使用将列表作为属性保存的包装器对象。如果包装器总是被传递,而不是列表,并且列表总是通过包装器访问,那么您可以简单地更新属性并且每个其他引用都会看到它。

编辑:查看您在我编写上述内容后添加的特定用例,它实际上不需要替换任何东西。您可以将翻译后的函数/类名设置到现有模块对象上(如果有必要,删除现有的)。一种更简单的方法可能是制作一个全新的模块并将其粘贴到sys.modules[modulename]. 只要您在任何其他模块导入它之前执行此操作,它们就永远不会看到未翻译的模块。

当然,这是一件愚蠢的事情。没有很好的方法可以将 Python 代码机器翻译成另一种人类语言。手动翻译它并将其作为自己的可导入模块提供给感兴趣的各方。

于 2013-05-31T13:23:01.117 回答
1

您应该意识到,变量实际上只不过是在表示范围的字典中搜索的名称。

范围(字典)实际上包含引用(思考、指针)。您可以替换指针,但在 Python 中无法就地更改对象。这就是你可以用 C 中的引用来做的事情(它可以让你访问底层的内存单元),但是对象大小必须匹配是有限制的。所以,不,你不能。

于 2013-05-31T13:23:40.033 回答