python中是否有类似的工具来模仿C中预处理器的行为



想要定义许多不同的函数在C.中具有相同的原型并不罕见

int f(int x, int y, char z, char *w);
int g(int x, int y, char z, char *w);
int h(int x, int y, char z, char *w);
int i(int x, int y, char z, char *w);
int j(int x, int y, char z, char *w);

为了在不必更改多行代码的情况下为这些函数中的每一个添加一个额外参数,我可以使用预处理器来保持灵活性:

#define FUNCTION(func) int (func)(int x, int y, char z, char *w)

然后用替换我的原型

FUNCTION(f);
FUNCTION(g);
FUNCTION(h);
FUNCTION(i);
FUNCTION(j);

然后,当我去定义函数时,我会使用以下行:

FUNCTION(f)
{
//do something with x,y,z,w
}
FUNCTION(g)
{
//do something else with x,y,z,w
}

有没有一种方法可以在python中实现这一点?也就是说,是否可以在Python中定义许多函数,所有这些函数都采用完全相同的参数,然后通过更改一行来修改它们的参数(比如添加或删除一个(?

您不会像在C中那样在Python中转发声明函数,所以这个问题的前提没有多大意义。最接近的类比是类型声明,您可以将其别名为:

from typing import Callable
FUNCTION = Callable[[int, int, str, str], int]

你也可以让函数本身返回函数,这样可能会消除很多重复,但你的例子不包括函数的主体,所以这并不是真正的映射。

对于您在编辑中描述的情况,您可以不声明参数类型,而是使用*args:

def f(*args):
x, y, z, w = args

或者,对于类型安全的解决方案(因为很难键入*args和**kwargs(,您可以让这些函数采用单个(类型化的(元组参数:

FUNCTION_ARGS = Tuple[int, int, str, str]
def f(args: FUNCTION_ARGS):
# next line will throw a mypy error if it doesn't match FUNCTION_ARGS
x, y, z, w = args  

除了eval/exec之外,标准Python没有内置的宏功能,也不支持静态生成元编程。

除了eval/exec之外,Python只提供动态(运行时(元编程,显然这是一种设计选择;例如,它确实提供了装饰器,可以覆盖一些用例。此外,Python源代码的读取(解析(是一成不变的,没有办法扩展语法。

在运行时创建函数和类的简单方法是将它们的源代码构建为文本字符串,并在其上调用evalexec。这就是标准库所做的,例如namedtuple

此外,PythonVM的几乎所有底层部分都是公开的;你可以访问Python字节码,例如,你可以用这种方式生成函数,但这是一个非常具有挑战性的操作,因为你需要注意很多细节(例如堆栈效应(,而且其中一些内部结构在Python版本之间不能保证稳定。理论上,只使用Python就可以在Python中重新实现exec,但这将非常困难,因为您必须自己重写Python编译器(用C编写(的相当大的一部分。

还有人试图使用Python提供的功能(或者忘记禁止(为Python添加宏功能。。。不过我没有这方面的经验。

相关内容

  • 没有找到相关文章

最新更新