2024-04-28 13:25:45 发布
网友
我在C中编程时,代码段只用于调试(记录命令等)。这些语句可以通过使用#ifdef预处理器指令完全禁用,如下所示:
C
#ifdef
#ifdef MACRO controlled text #endif /* MACRO */
在python中做类似事情的最佳方法是什么?
python
重要的是要理解在Python中def和class是两个常规的可执行语句。。。
def
class
import os if os.name == "posix": def foo(x): return x * x else: def foo(x): return x + 42 ...
Python语言在这点上与C和C++有本质的区别,因为没有“编译时”的概念,只有两个阶段是“解析时间”(当源代码被读取)和“运行时”,当解析代码(通常主要由定义语句,但实际上是任意Python代码组成)执行时。
我使用术语“解析时间”,即使在技术上,当转换中读取的源代码是一个完全编译到字节码时,因为C和C++编译的语义不同,例如函数的定义发生在那个阶段(而不是在Python中运行时发生)。
甚至C和C++的等价的^ {CD3>}(Python是^ {CD4>})是在运行时执行而不是在编译(解析)时间内执行的正则语句,因此它可以放置在常规的Python ^ {CD5>}内。很常见的情况是,例如在try块中有一个import,如果系统上不存在特定的可选Python库,该块将为某些函数提供替代定义。
try
import
最后请注意,在Python中,您甚至可以在运行时使用exec从头开始创建新的函数和类,而不一定在源代码中包含它们。您还可以使用代码直接组装这些对象,因为类和函数实际上只是常规对象(但是,这通常只针对类)。
exec
有些工具试图将def和class定义和import语句视为“静态”,例如,对Python代码进行静态分析,以在可疑片段上生成警告,或者创建一个独立的可部署包,该包不依赖于在系统上安装特定的Python来运行程序。然而,所有这些人都需要考虑Python在这个领域比C或C++更具活力,并且它们也允许在自动分析失败的地方添加异常。
如果只想禁用日志记录方法,请使用logging模块。如果日志级别设置为exclude,比如debug语句,那么logging.debug将非常接近no op(它只检查日志级别并返回,而不插入日志字符串)。
logging
logging.debug
如果您想在字节码编译时实际删除特定变量上的代码块,您唯一的选择是相当神秘的__debug__全局变量。除非将-O标志传递给Python(或将PYTHONOPTIMIZE设置为环境中的非空标志),否则此变量设置为True。
__debug__
-O
PYTHONOPTIMIZE
True
如果在if语句中使用__debug__,则if语句实际上只编译成True分支。这种特殊的优化与Python得到的预处理器宏非常接近。
if
注意,与宏不同,您的代码在if的两个分支中的语法必须仍然正确。
要显示__debug__如何工作,请考虑以下两个函数:
def f(): if __debug__: return 3 else: return 4 def g(): if True: return 3 else: return 4
现在用dis查看它们:
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是“优化的”。
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 """
希望这是一个有用的例证。
重要的是要理解在Python中
<>所以,在C和C++中,使用预处理器做什么,你可以使用常规的Python语言。def
和class
是两个常规的可执行语句。。。Python语言在这点上与C和C++有本质的区别,因为没有“编译时”的概念,只有两个阶段是“解析时间”(当源代码被读取)和“运行时”,当解析代码(通常主要由定义语句,但实际上是任意Python代码组成)执行时。
我使用术语“解析时间”,即使在技术上,当转换中读取的源代码是一个完全编译到字节码时,因为C和C++编译的语义不同,例如函数的定义发生在那个阶段(而不是在Python中运行时发生)。
甚至C和C++的等价的^ {CD3>}(Python是^ {CD4>})是在运行时执行而不是在编译(解析)时间内执行的正则语句,因此它可以放置在常规的Python ^ {CD5>}内。很常见的情况是,例如在
try
块中有一个import
,如果系统上不存在特定的可选Python库,该块将为某些函数提供替代定义。最后请注意,在Python中,您甚至可以在运行时使用
exec
从头开始创建新的函数和类,而不一定在源代码中包含它们。您还可以使用代码直接组装这些对象,因为类和函数实际上只是常规对象(但是,这通常只针对类)。有些工具试图将
def
和class
定义和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__
如何工作,请考虑以下两个函数:现在用
dis
查看它们:如您所见,只有
f
是“优化的”。下面是一个用于区分Python Tk程序的Python 2&3的示例:
希望这是一个有用的例证。
相关问题 更多 >
编程相关推荐