有没有办法在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())
"""
我该如何建立一个“宏”,以避免这种重复?
回答新的问题。
在你的第一个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宏指令。
如果您只想要C宏,请使用C预处理器预处理您的脚本。咄。
如果你想#include,它被称为导入。
如果你想#define,使用一个不可变的对象。认为const int foo = 1;而不是#define foo 1.一些对象是不可变的,就像元组一样。你可以编写一个让变量充分不变的函数。在网上搜索一个例子。我更喜欢静态类来处理这种情况。
如果你想FOO(x,y)... code ...;学习如何使用函数和类。
Python中的'CPP'宏的大多数用法可以通过编写函数来完成。您可能希望获得一本关于higher order functions的书籍,以处理更复杂的案例。我个人喜欢一本名为“高阶Perl(HOP)”的书,尽管它不是基于Python的,但本书的大部分内容都涵盖了与语言无关的想法 - 这些想法应该是每个程序员都需要学习的。
对于所有的意图和目的,您只需要在Python中使用的C预处理器,它并不完全是开箱即用的,它能够#define常量,这常常是错误的事情,即使在C和C++中也是如此。
现在在python中以一种智能的方式实现lisp宏,并且实际上需要它们... 清除喉咙并扫过地毯。
顺便说一句,如果你写出一个python文件然后被导入到程序中的其他地方,除非您使用单独的python解释器来运行它,否则除非是您的程序目的(编写编写程序的程序),否则您应该考虑另一种设计。在最后一种情况下,你应该阅读HOP。 – TerryP 2010-05-28 08:10:46
你的例子在Python中很像'len()'...除了'len()'更灵活。无论如何,Python有足够的灵活性来完成你用C宏执行的大部分工作,而无需将它作为宏来完成。例如,您可以编写一个返回函数列表的函数。或类。或功能字典(一种做工厂的方式)。 – 2010-05-27 21:48:18
已经有一些关于这方面的讨论:http://stackoverflow.com/questions/764412/python-macros-use-cases – 2010-05-27 21:51:44
将不会有宏,而圭多仍然负责 – 2010-05-27 22:17:19