1

我有一个非常简单的装饰器函数,用于通过模块的__all__属性公开模块中定义的函数。因为我将它用于包中的多个模块,所以我在包的__init__.py.

因为我不能__all__在定义中使用,因为它会引用__all__模块__init__.py(或者更确切地说是包)的,我目前这样做是这样的:

def expose ( fn ):
    fn.__globals__['__all__'].append( fn.__name__ )

这似乎工作得很好。但是我不确定使用该__global__属性是否是理想的方法,特别是因为该属性似乎没有记录(至少我在文档中找不到任何关于它的信息)。

是否可以__globals__正常使用,或者是否有更简单、更强大的方法来完成这项工作?

编辑:

为了澄清起见,我不一定需要访问__all__模块的属性。我可以轻松地使用不同的名称并最终得到相同的问题。我之所以使用它,是__all__因为它在模块中保存所有暴露对象的目的符合我的意图。但同时我也可以命名它exposedFunctions或其他任何东西。所以问题更多的是关于如何访问模块的全局属性。

4

1 回答 1

2

你可能会喜欢 Thomas Rachel 的AllList装饰器:

class AllList(list):
    """list which can be called in order to be used as a __all__-adding decorator"""
    def __call__(self, obj):
        """for decorators"""
        self.append(obj.__name__)
        return obj 

从任何地方导入它,并且在您的模块顶部有

__all__ = whereever.AllList()

然后在你的模块中它看起来像

@__all__
def some_func():
...

@__all__
def another_func():
...

并且无需担心全局变量。

更新

如果您真的想担心全局变量,请查看Use a class in the context of a different module —— 但是它并不漂亮。

于 2011-10-06T23:31:58.280 回答