英文:
Catch undefined module function calls and process it within the module
问题
我的 my_module
只有一个名为 f
的函数。
所以
import my_module
my_module.f()
是有效的代码。
但我想要以类似 my_module.f()
被调用的方式包装未定义的函数调用。并且我想要默认地在模块内部完成,不需要任何额外的代码,也就是说,我想要将所有的包装代码放在 my_module
内部。所以当我执行以下操作时:
import my_module
my_module.this_function_is_not_defined()
Python 不会引发异常,而是调用 my_module.f()
。
这有点像覆盖类的 __getattr__
或字典的 __getitem__
。
在模块内部是否有可能实现这个功能?
类似于
globals().__getitem__ = lambda self, x: self.__getitem__ if self.__contains__(x) else f
英文:
My my_module
has just 1 function called f
.
So
import my_module
my_module.f()
is a valid code.
But I want to wrap undefined function calls the way my_module.f()
is called instead. And I want to do it by default without any exta-code outside the module, i.e. I want to put all the wrapping code inside my_module
. So when I do
import my_module
my_module.this_function_is_not_defined()
the python will not raise an exception, but call my_module.f()
instead.
It's kind of overriding __getattr__
of the class or __getitem__
of the dict.
Is it possible to do it within the module?
Kind of
globals().__getitem__ = lambda self, x: self.__getitem__ if self.__contains__(x) else f
答案1
得分: 2
你可以在模块上设置__getattr__
,就像在类上设置一样。假设我们在my_module.py
中有以下内容:
def f():
print('hello world')
def __getattr__(attr):
return f
我们可以这样使用它:
>>> import my_module
>>> my_module.bar()
hello world
>>> my_module.this_function_is_not_defined()
hello world
等等。
英文:
You can set __getattr__
on a module just like on a class. Assuming that we have the following in my_module.py
:
def f():
print('hello world')
def __getattr__(attr):
return f
We can use it like this:
>>> import my_module
>>> my_module.bar()
hello world
>>> my_module.this_function_is_not_defined()
hello world
Etc.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论