2010-05-27 36 views
3

原來的問題是:有沒有辦法在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

回答

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中執行導入。

3

不,Python不支持像C這樣的預處理器宏。您的示例並不是您在Python中需要做的事;你可能會考慮提供一個相關的例子,以便人們可以建議一種Pythonic方式來表達你所需要的東西。

2

雖然似乎有一個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) 
2

這不是在語言級別的支持。在Python中,你通常用一個正常的功能或正常變量,你可能會在C.

使用的#define
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風格的宏需要。

0

你可以這樣寫到第二個文件,而不是複製的代碼串

""" 
from firstFile import replaceProgramFilesPath 
""" 
2

,如果你想字符串轉換爲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

相關問題