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

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

问题描述:

原来的问题是:有没有办法在Python中将代码转换为字符串,反之亦然?

是否存在,因为它们是用C声明宣布在Python宏的方式:

#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()) 
""" 

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

+2

你的例子在Python中很像'len()'...除了'len()'更灵活。无论如何,Python有足够的灵活性来完成你用C宏执行的大部分工作,而无需将它作为宏来完成。例如,您可以编写一个返回函数列表的函数。或类。或功能字典(一种做工厂的方式)。 – 2010-05-27 21:48:18

+0

已经有一些关于这方面的讨论:http://stackoverflow.com/questions/764412/python-macros-use-cases – 2010-05-27 21:51:44

+0

将不会有宏,而圭多仍然负责 – 2010-05-27 22:17:19

回答新的问题。

在你的第一个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不支持像C这样的预处理器宏。您的示例并不是您在Python中需要做的事;你可能会考虑提供一个相关的例子,以便人们可以建议一种Pythonic方式来表达你所需要的东西。

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

最接近的宏可能是定义一个全局函数。相当于你的C风格的宏蟒蛇可能是:

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) 

基本上是相同的。

因为它已被前面所提到的,您的示例宏在蟒蛇多余的,因为你可以简单的写:

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

这不是在语言级别的支持。在Python中,你通常用一个正常的功能或正常变量,你可能会在C.

使用的#define

好,勇敢,有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 
""" 

,如果你想字符串转换为Python代码,使用eval一般而言的。你很少需要Python中的eval。标准库中有一个模块可以告诉你一些关于对象代码的东西(在interp中不起作用),我从来没有直接使用它。你可以在comp.lang.python上找到解释它的东西。对于'C'宏,这似乎是你问题的真正焦点。

清除喉咙请勿在PYTHON CODE中使用C宏指令。

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

  2. 如果你想#include,它被称为导入。

  3. 如果你想#define,使用一个不可变的对象。认为const int foo = 1;而不是#define foo 1.一些对象是不可变的,就像元组一样。你可以编写一个让变量充分不变的函数。在网上搜索一个例子。我更喜欢静态类来处理这种情况。

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

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

对于所有的意图和目的,您只需要在Python中使用的C预处理器,它并不完全是开箱即用的,它能够#define常量,这常常是错误的事情,即使在C和C++中也是如此。

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

+0

顺便说一句,如果你写出一个python文件然后被导入到程序中的其他地方,除非您使用单独的python解释器来运行它,否则除非是您的程序目的(编写编写程序的程序),否则您应该考虑另一种设计。在最后一种情况下,你应该阅读HOP。 – TerryP 2010-05-28 08:10:46