簡體   English   中英

有沒有辦法在Python中將代碼轉換為字符串,反之亦然?

[英]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。

  1. 如果您只想要一個C宏,請使用C預處理器預處理腳本。 咄。

  2. 如果你想要#include,那就叫做import。

  3. 如果需要#define,請使用不可變對象。 想想const int foo = 1; 而不是#define foo 1.有些對象是不可變的,就像元組一樣。 您可以編寫一個使變量充分不可變的函數。 在網上搜索一個例子。 對於某些類似的情況,我更喜歡靜態類。

  4. 如果你想要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM