Python 的 C 预处理器宏等效项

问题描述 投票:0回答:4

我习惯在 C 中定义宏(不仅仅是常量)

#define loop(i,a,b) for(i=a; i<b; ++i)
#define long_f(a,b,c) (a*0.123 + a*b*5.6 - 0.235*c + 7.23*c - 5*a*a + 1.5)

有没有办法在 python 中使用 preprocess 而不是函数来做到这一点?

*通过预处理我的意思是在运行代码之前替换定义的出现(实际上不是整个代码,而是代码的其余部分,因为由于它是代码的一部分,我想它将在运行时替换所有内容) .

如果有的话值得吗?运行时间会有显着差异吗?

python macros preprocessor
4个回答
10
投票

有办法吗?是的。总有办法的。你应该这样做吗?可能不是。

只需定义一个函数即可完成您想要的操作。如果您只是担心代码变得很长并且想要单行代码,则可以使用 lambda 函数。

long_f = lambda a,b,c: a*0.123 + a*b*5.6 - 0.235*c + 7.23*c - 5*a*a + 1.5
long_f(1,2,3) == 28.808

当然,你的第一个示例在 Python 中已经更漂亮了。

for i in range(a,b):
    ...

编辑:为了完整起见,我应该按要求回答问题。如果您绝对必须预处理 Python 代码,则可以使用任何专为网页等模板化而设计的编程语言。例如,我听说 PHP 用于预处理代码。您无需编写 HTML,而是编写代码。当您想要预处理某些内容时,您可以执行 PHP 块。


8
投票

好吧,如果您要执行一些可以提前执行的非常困难的计算,那么,也许这是有道理的:通常用户对快速程序而不是慢速程序更满意。

但是,当谈到“原始性能”(即算术计算的速度)时,我担心 python 并不是一个好的选择。至少如果我们谈论标准 python 实现,称为 CPython。

或者,您可以检查其他变体:

  • PyPy。这是纯 Python 中的替代 Python 实现。感谢 JIT 编译器,它提供了更好的性能,但需要更多的内存。
  • Cython。这是 Python 的扩展,它允许人们[方便地]为代码的性能关键部分创建可编译的片段。
  • 使用您喜欢的任何外部预处理器。我首先想到的是M4FilePP,但是它们有很多。

0
投票

答案是否定的,在 python 中,你实际上不能像 C、C++、PL/1、汇编器等那样包含“内联/流/任何内容”的代码。此功能的实现发生在初始宏/处理器/语法期间经过。它可以很容易地添加,并且有很多原因可能希望直接内联包含代码而不将其作为函数的一部分。此功能使得在多个类或函数定义中使用相同的代码片段成为可能。例如,如果没有它,在多个类中定义相同的 GTK+ 元素会很痛苦。这种能力的缺乏与解释无关,因为它发生在句法分析之前。它不包含在 perl 和 python 等解释性脚本语言中,只是因为开发人员不想提供该功能。


-1
投票
import inspect

frame = inspect.currentframe()
print(f"{frame.f_lineno}\tdebugtext")
l = lambda: frame.f_lineno
print(f"{l()}\tdebugtext")
© www.soinside.com 2019 - 2024. All rights reserved.