python中是否有等效的工具来模仿C语言中预处理器的行为?

问题描述 投票:1回答:2

[在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中定义许多函数,所有这些函数都具有完全相同的参数,然后通过更改单行来修改其参数(例如添加或删除一个)?

python dry function-declaration
2个回答
1
投票

您不会像在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  

1
投票

[Standard Python没有内置的宏功能,除了eval / exec外,不支持生成元编程。显然,这是一种设计选择。它确实提供了装饰器,可以涵盖一些用例。

但是,您可以在运行时通过将函数和类的源代码构建为文本字符串并在其上调用evalexec来创建函数和类。这是标准库对namedtuple所做的操作。

也有人tried to add macro power to Python ...但是我对此没有经验。

© www.soinside.com 2019 - 2024. All rights reserved.