最初的问题是:
有没有办法在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() )
"""
如何构建一个避免重复的“宏”?
答案 0 :(得分:3)
不,Python不支持像C这样的预处理器宏。你的例子不是你需要在Python中做的事情;您可以考虑提供一个相关的示例,以便人们可以建议使用Pythonic方式来表达您的需求。
答案 1 :(得分:2)
虽然似乎有一个名为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)
答案 2 :(得分:2)
语言级别不支持此功能。在Python中,您通常使用普通函数或普通变量,您可以在C中使用#define。
答案 3 :(得分:2)
回答新问题。
在您的第一个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
中进行导入。
答案 4 :(得分:2)
一般来说,如果要将字符串转换为python代码,请使用eval。你很少需要Python中的eval。标准库中的某个模块可以告诉你一些关于对象代码(在interp中不起作用),我从来没有直接使用它。你可以在comp.lang.python上找到解释它的东西。
至于“C”宏似乎是你问题的真正焦点。
清除喉咙请勿在PYTHON代码中使用C MACROS。
如果您只想要一个C宏,请使用C预处理器预处理脚本。咄。
如果你想要#include,那就叫做import。
如果您想要#define,请使用不可变对象。想想const int foo = 1;而不是#define foo 1.有些对象是不可变的,就像元组一样。您可以编写一个使变量充分不可变的函数。在网上搜索一个例子。对于某些类似的情况,我更喜欢静态类。
如果你想要FOO(x,y)......代码......;学习如何使用函数和类。
Python中'CPP'宏的大多数用法都可以通过编写函数来完成。您可能希望获得一本关于higher order functions的书籍,以便处理更复杂的案例。我个人喜欢一本名为Higher Order Perl(HOP)的书,尽管它不是基于Python的,但本书的大部分内容都涵盖了语言独立的想法 - 这些想法应该是每个程序员都需要学习的。
对于所有意图和目的而言,在Python中只需要使用C预处理器,而不是开箱即用,是#define常量的能力,这通常是错误的做法,甚至在C和C ++中。
现在在python中实现lisp宏,以一种聪明的方式实际需要它们...... 清除喉咙并在地毯下扫描。
答案 5 :(得分:0)
嗯,对于勇敢者来说,有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风格的宏。
答案 6 :(得分:0)
您可以将其写入第二个文件,而不是复制代码字符串
"""
from firstFile import replaceProgramFilesPath
"""