python 中是否有等效工具来模拟 C 中预处理器的行为?
Is there an equivalent tool in python to mimic the behaviour of the pre-processor in 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]
您也可以拥有自己 return 函数的函数,并可能以这种方式消除大量重复,但您的示例不包括函数体,因此不会真正映射。
对于您在编辑中描述的情况,您可以不声明参数类型而改用 *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
标准 Python 没有内置宏工具,不支持静态生成元编程,除了 eval
/exec
。
排除 eval/exec
Python 仅提供动态(运行 时间)元编程,显然这是一种设计选择;例如,它确实提供了可以涵盖某些用例的装饰器。 Python 源代码的阅读(解析)也是一成不变的,无法扩展语法。
在 运行 时创建函数和 类 的简单方法是将它们的源代码构建为文本字符串并调用 eval
或 exec
它。这就是标准库为 namedtuple
.
所做的事情
此外,几乎所有 Python VM 的低级部分都暴露了;您可以访问 Python 字节码,并且您可以通过这种方式生成函数,但这是一个非常具有挑战性的操作,因为您需要注意很多细节(例如堆栈效应),而且其中一些内部结构不是保证 Python 版本之间稳定。理论上可以仅使用 Python 在 Python 中重新实现 exec
,但这将非常困难,因为您必须重写 Python 编译器的相当大一部分(即是自己用C)写的。
也有人 tried to add macro power to Python 只是使用 Python 提供的(或忘记禁止)...但是我没有经验。
在 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]
您也可以拥有自己 return 函数的函数,并可能以这种方式消除大量重复,但您的示例不包括函数体,因此不会真正映射。
对于您在编辑中描述的情况,您可以不声明参数类型而改用 *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
标准 Python 没有内置宏工具,不支持静态生成元编程,除了 eval
/exec
。
排除 eval/exec
Python 仅提供动态(运行 时间)元编程,显然这是一种设计选择;例如,它确实提供了可以涵盖某些用例的装饰器。 Python 源代码的阅读(解析)也是一成不变的,无法扩展语法。
在 运行 时创建函数和 类 的简单方法是将它们的源代码构建为文本字符串并调用 eval
或 exec
它。这就是标准库为 namedtuple
.
此外,几乎所有 Python VM 的低级部分都暴露了;您可以访问 Python 字节码,并且您可以通过这种方式生成函数,但这是一个非常具有挑战性的操作,因为您需要注意很多细节(例如堆栈效应),而且其中一些内部结构不是保证 Python 版本之间稳定。理论上可以仅使用 Python 在 Python 中重新实现 exec
,但这将非常困难,因为您必须重写 Python 编译器的相当大一部分(即是自己用C)写的。
也有人 tried to add macro power to Python 只是使用 Python 提供的(或忘记禁止)...但是我没有经验。