繁体   English   中英

有没有办法在Python中将代码转换为字符串,反之亦然?

[英]Is there a way to convert code to a string and vice versa in Python?

最初的问题是:

有没有办法在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() )
"""

我如何建立一个避免这种重复的“宏”?

不,Python不支持像C这样的预处理器宏。你的例子不是你需要在Python中做的事情; 您可以考虑提供相关示例,以便人们可以建议使用Pythonic方式来表达您的需求。

虽然似乎有一个名为pypp的 python预处理库,但我并不完全熟悉它。 python内置实际上没有预处理功能。 Python代码被翻译成字节码,没有中间步骤。 如果你是python的初学者我会建议完全避免pypp。

最接近的宏可能是定义一个全局函数。 等效于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)

语言级别不支持此功能。 在Python中,您通常使用普通函数或普通变量,您可以在C中使用#define。

回答新问题。

在您的第一个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进行导入。

一般来说,如果要将字符串转换为python代码,请使用eval。 你很少需要Python中的eval。 标准库中的某个模块可以告诉你一些关于对象代码(在interp中不起作用),我从来没有直接使用它。 你可以在comp.lang.python上找到解释它的东西。

至于“C”宏似乎是你问题的真正焦点。

清除喉咙不要在PYTHON代码中使用C MACROS。

  1. 如果您只想要一个C宏,请使用C预处理器预处理脚本。 咄。

  2. 如果你想要#include,那就叫做import。

  3. 如果需要#define,请使用不可变对象。 想想const int foo = 1; 而不是#define foo 1.有些对象是不可变的,就像元组一样。 您可以编写一个使变量充分不可变的函数。 在网上搜索一个例子。 对于某些类似的情况,我更喜欢静态类。

  4. 如果你想要FOO(x,y)......代码...; 学习如何使用函数和类。

Python中'CPP'宏的大多数用法都可以通过编写函数来完成。 您可能希望获得一本关于更高阶函数的书籍,以便处理更复杂的案例。 我个人喜欢一本名为Higher Order Perl(HOP)的书,虽然它不是基于Python的,但本书的大部分内容都涵盖了语言独立的想法 - 这些想法应该是每个程序员都需要学习的。

对于所有意图和目的,你需要在Python中使用的C预处理器的唯一用途是#define常量,这通常是错误的,即使在C和C中也是如此。 C ++。

现在在python中实现lisp宏,以一种聪明的方式实际需要它们...... 清除喉咙并在地毯下扫过

那么,对于勇敢者来说,有Metapython:

http://code.google.com/p/metapython/wiki/Tutorial

For instance, the following MetaPython code:

$for i in range(3):
    print $i

will expand to the following Python code:

print 0
print 1
print 2

但是如果你刚开始使用Python,你可能不需要它。 只是继续练习通常的动态功能(鸭子打字,可调用对象,装饰器,生成器......),你不会觉得需要C风格的宏。

您可以将其写入第二个文件,而不是复制代码字符串

"""
from firstFile import replaceProgramFilesPath
"""

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM