有没有办法在Python中将代码转换为字符串及其逆操作?

4 投票
7 回答
8291 浏览
提问于 2025-04-15 23:16

最初的问题是:

有没有办法在Python中像在C语言中那样声明宏:

#define OBJWITHSIZE(_x) (sizeof _x)/(sizeof _x[0])

我想了解的是:

在Python中有没有办法避免代码重复?在我写的程序的一部分,我有一个函数:

def replaceProgramFilesPath(filenameBr):
  def getProgramFilesPath():
    import os
    return os.environ.get("PROGRAMFILES") + chr(92)
  return filenameBr.replace("<ProgramFilesPath>",getProgramFilesPath() )

在另一部分,我有这段代码嵌入在一个字符串中,稍后会输出到一个Python文件中,这个文件会被执行:

"""
def replaceProgramFilesPath(filenameBr):
  def getProgramFilesPath():
    import os
    return os.environ.get("PROGRAMFILES") + chr(92)
  return filenameBr.replace("<ProgramFilesPath>",getProgramFilesPath() )
"""

我该如何构建一个“宏”来避免这种重复呢?

7 个回答

2

虽然有一个叫做 pypp 的库可以用来做 Python 的预处理,但我对它不是很熟悉。实际上,Python 本身并没有内置的预处理功能。Python 代码会直接被转换成字节码,没有中间步骤。如果你是 Python 新手,我建议你完全避免使用 pypp。

在 Python 中,最接近宏的东西可能就是定义一个全局函数。你在 C 语言中使用的宏在 Python 中可以用下面的方式表示:

import sys
OBJWITHSIZE = lambda x: sys.getsizeof(x) / sys.getsizeof(x[0])
aList = [1, 2, 4, 5]
size = OBJWITHSIZE(aList)
print str(size)

需要注意的是,通常你不需要获取 Python 对象的大小,因为 Python 会自动处理所有的内存分配和删除,除非你在做一些非常奇怪的事情。

除了使用 lambda 函数,你也可以这样做:

import sys
def getSize(x):
   return sys.getsizeof(x) / sys.getsizeof(x[0])

OBJWITHSIZE = getSize
aList = [1, 2, 4, 5]
size = OBJWITHSIZE(aList)
print str(size)

这基本上是一样的。

正如之前提到的,你的示例宏在 Python 中是多余的,因为你可以简单地写:

aList = [1, 2, 4, 5]
size = len(aList)
print str(size)
2

在语言层面上,这个是不支持的。在Python中,通常你会用普通的函数或者普通的变量,来替代在C语言中可能会用到的#define。

3

回答这个新问题。

在你的第一个 Python 文件中(比如叫做 first.py):

import os

def replaceProgramFilesPath(filenameBr):
  new_path = os.environ.get("PROGRAMFILES") + chr(92)
  return filenameBr.replace("<ProgramFilesPath>", new_path)

在第二个 Python 文件中(比如叫做 second.py):

from first import replaceProgramFilesPath
# now replaceProgramFilesPath can be used in this script.

注意,first.py 需要在 Python 查找模块的路径中,或者和 second.py 在同一个文件夹里,这样你才能在 second.py 中进行导入。

撰写回答