在模块中使实例方法全局化?

2024-10-02 10:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个可以导入并按原样使用的lib,还有一个start脚本,它创建了一个main类的实例,以便在脚本中使用:

# read config, init stuff, and then create an instance

r = RepoClient(config)

现在,start脚本接受一个'command'参数,从现在起,它必须像以下那样调用:

repo config.json -c 'r.ls()'

即必须使用“r”变量。你知道吗

我希望能够删除'r'变量。为此,start脚本需要ls函数。在创建r实例之后,我可以通过在脚本中放入以下内容来完成:

ls = r.ls

RepoClient类支持的所有命令。你知道吗

有什么自动的吗?当然,下面的代码不起作用,但您可以理解:

from r import *

我能想到的是用一个定制的@command注释来注释方法,迭代所有的方法并检查它,如果找到了,将它设置为一个脚本全局,但是希望电池已经支持这样的东西了;d

编辑:目前,作为最后一个参数传递的命令按以下方式运行:

exec(sys.argv[2])

Tags: and实例方法命令脚本configreadinit
1条回答
网友
1楼 · 发布于 2024-10-02 10:23:22

不,没有办法“自动”做到这一点。但是,实际上不需要将项复制到全局命名空间中。您可以将命名空间传递给exec使用。您可以给您的RepoClient一个__getitem__方法,允许它充当名称空间。下面是一个简单的例子:

class Foo(object):
    def blah(self):
        print("Blah!")

    def __getitem__(self, attr):
        return getattr(self, attr)

f = Foo()

exec('blah()', globals(), f)

它输出Blah!。你知道吗

相关问题 更多 >

    热门问题