如何在python中实现“ifdef”?

2024-04-28 13:25:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在C中编程时,代码段只用于调试(记录命令等)。这些语句可以通过使用#ifdef预处理器指令完全禁用,如下所示:

 #ifdef MACRO

 controlled text

 #endif /* MACRO */

python中做类似事情的最佳方法是什么?


Tags: 方法text命令代码段编程记录指令语句
3条回答

重要的是要理解在Python中defclass是两个常规的可执行语句。。。

import os

if os.name == "posix":
    def foo(x):
        return x * x
else:
    def foo(x):
        return x + 42
...
<>所以,在C和C++中,使用预处理器做什么,你可以使用常规的Python语言。

Python语言在这点上与C和C++有本质的区别,因为没有“编译时”的概念,只有两个阶段是“解析时间”(当源代码被读取)和“运行时”,当解析代码(通常主要由定义语句,但实际上是任意Python代码组成)执行时。

我使用术语“解析时间”,即使在技术上,当转换中读取的源代码是一个完全编译到字节码时,因为C和C++编译的语义不同,例如函数的定义发生在那个阶段(而不是在Python中运行时发生)。

甚至C和C++的等价的^ {CD3>}(Python是^ {CD4>})是在运行时执行而不是在编译(解析)时间内执行的正则语句,因此它可以放置在常规的Python ^ {CD5>}内。很常见的情况是,例如在try块中有一个import,如果系统上不存在特定的可选Python库,该块将为某些函数提供替代定义。

最后请注意,在Python中,您甚至可以在运行时使用exec从头开始创建新的函数和类,而不一定在源代码中包含它们。您还可以使用代码直接组装这些对象,因为类和函数实际上只是常规对象(但是,这通常只针对类)。

有些工具试图将defclass定义和import语句视为“静态”,例如,对Python代码进行静态分析,以在可疑片段上生成警告,或者创建一个独立的可部署包,该包不依赖于在系统上安装特定的Python来运行程序。然而,所有这些人都需要考虑Python在这个领域比C或C++更具活力,并且它们也允许在自动分析失败的地方添加异常。

如果只想禁用日志记录方法,请使用logging模块。如果日志级别设置为exclude,比如debug语句,那么logging.debug将非常接近no op(它只检查日志级别并返回,而不插入日志字符串)。

如果您想在字节码编译时实际删除特定变量上的代码块,您唯一的选择是相当神秘的__debug__全局变量。除非将-O标志传递给Python(或将PYTHONOPTIMIZE设置为环境中的非空标志),否则此变量设置为True

如果在if语句中使用__debug__,则if语句实际上只编译成True分支。这种特殊的优化与Python得到的预处理器宏非常接近。

注意,与宏不同,您的代码在if的两个分支中的语法必须仍然正确。


要显示__debug__如何工作,请考虑以下两个函数:

def f():
    if __debug__: return 3
    else: return 4

def g():
    if True: return 3
    else: return 4

现在用dis查看它们:

>>> dis.dis(f)
  2           0 LOAD_CONST               1 (3)
              3 RETURN_VALUE        
>>> dis.dis(g)
  2           0 LOAD_GLOBAL              0 (True)
              3 JUMP_IF_FALSE            5 (to 11)
              6 POP_TOP             
              7 LOAD_CONST               1 (3)
             10 RETURN_VALUE        
        >>   11 POP_TOP             

  3          12 LOAD_CONST               2 (4)
             15 RETURN_VALUE        
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        

如您所见,只有f是“优化的”。

下面是一个用于区分Python Tk程序的Python 2&3的示例:


import sys
if sys.version_info[0] == 3:
    from tkinter import *
    from tkinter import ttk
else:
    from Tkinter import *
    import ttk

""" rest of your code """

希望这是一个有用的例证。

相关问题 更多 >