[英]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。
如果您只想要一個C宏,請使用C預處理器預處理腳本。 咄。
如果你想要#include,那就叫做import。
如果需要#define,請使用不可變對象。 想想const int foo = 1; 而不是#define foo 1.有些對象是不可變的,就像元組一樣。 您可以編寫一個使變量充分不可變的函數。 在網上搜索一個例子。 對於某些類似的情況,我更喜歡靜態類。
如果你想要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.