Pythoness:德爾斐阿波羅神諭的女祭司。
Emery Berger 的 Pythoness,Kyle Gwilt 和 Stephen Freund 的擴展
Pythoness 根據自然語言描述和測試自動產生 Python 程式碼。
注意Pythoness 需要連接到 LLM 才能運作。以下是如何將 Pythoness 與 OpenAI 帳戶連結的範例。其他法學碩士,請參閱他們的文件。
開啟AI帳戶。您的帳戶需要有正餘額才能發揮作用(檢查您的餘額)。如果您從未購買過積分,則需要購買至少 1 美元的積分(如果您的 API 帳戶是在 2023 年 8 月 13 日之前創建的)或 0.50 美元的積分(如果您有較新的 API 帳戶)。在這裡拿鑰匙。
取得 API 金鑰後,將其設定為名為
OPENAI_API_KEY
的環境變數。export OPENAI_API_KEY= < your-api-key >
安裝 Pythoness 最簡單的方法是透過 pip:
python3 -m pip install pythoness
要使用 Pythoness,您只需匯入pythoness
模組,然後使用@pythoness.spec
裝飾器來指定所需的功能:
import pythoness
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." )
def myfib ( n : int ) -> int :
""
此程式碼將在內部產生一個名為myfib
的 Python 函數,用於計算斐波那契數列中的第 n 個數字。要實際執行函數,您可以像呼叫任何其他 Python 函數一樣呼叫它:
for i in range ( 20 ):
print ( myfib ( i ))
Pythoness 快取將自然語言翻譯為 Python 的結果,因此在同一目錄中的後續執行將會更快(Pythoness 建立一個名為pythoness-cache.db
的資料庫來保存這些翻譯)。
若要關閉所有日誌訊息,請使用PYNS_QUIET
環境變數:
env PYNS_QUIET=1 python3 myfib.py
您可以透過提供一些測試來指導 Pythoness。 Pythoness 將使用測試來產生 Python 程式碼並驗證它。測試只是包含 Python 程式碼或函數的字串列表,它們的計算結果都應為True
。
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." ,
tests = [ "myfib(1) == 1" , "myfib(2) == 1" ])
def myfib ( n : int ) -> int :
""
您也可以透過基於屬性的測試來指導 Pythoness。為此,請描述您希望程式展示的屬性。 Pythoness 將執行一個基於屬性的測試器(Hypothesis),該測試器將執行多次測試以確保產生的函數符合指定的屬性。這種方法比上面描述的單元測試強大得多。
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [({ 'n' : 'integers(1,20)' }, "myfib(n+2) == myfib(n+1)+myfib(n)" )])
def myfib ( n : int ) -> int :
""
內建單元測試框架中的測試案例是測試的最終選項,可以透過提供 Pythoness 測試用例或測試用例模組來使用:
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [ testmodule . TestFib ])
def myfib ( n : int ) -> int :
""
您可以透過為 Pythoness 提供與它將產生的程式碼相關的函數和類別來進一步指導 Pythoness。它使用提供的函數和類別的文檔字串來理解它們的用途。 Pythoness 可以利用以這種方式自行產生的函數,其中文件字串在spec
中指定。
related_objs
是一個列表,可以包含函數、類別或特殊字串:
'cls'
表示生成函數所在類別中除自身之外的所有內容'*'
表示產生的函數所在檔案中除自身之外的所有內容 @ pythoness . spec ( "Encodes a string using a single-shift Caesar cipher" )
def encode ( s : str ) -> str :
""
@ pythoness . spec ( "Decodes a string given to encode()" , related_objs = [ encode ])
def decode ( s : str ) -> str :
""
使用類別時,最好使用 Python 的__slots__
功能。雖然 Pythoness 可以在沒有它的情況下運行,但這增加了 Pythoness 的一致性。
您可以讓 Pythoness 用產生的函數直接取代檔案中的規格:只需新增「replace=True」:
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." ,
tests = [ "myfib(1) == 1" , "myfib(2) == 1" ],
replace = True )
def myfib ( n : int ) -> int :
""
例如,Pythoness 產生了以下程式碼:
def myfib(n: int) -> int:
"""
Compute the nth number in the Fibonacci series.
:param n: The position of the desired number in the Fibonacci series
:type n: int
:return: The nth number in the Fibonacci series
:rtype: int
"""
if n <= 0:
raise ValueError("n must be a positive integer")
elif n == 1 or n == 2:
return 1
else:
fib1, fib2 = 1, 1
for _ in range(3, n + 1):
fib1, fib2 = fib2, fib1 + fib2
return fib2
您也可以使用“PYNS_REPLACE”環境變數來取代每個產生的函數:
env ' PYNS_REPLACE ' =1
Pythoness 提供了一些其他方法來控制其行為。這些都是spec
的參數。提供的值表示預設值。
max_retries=3
:控制因失敗而重試的最大次數(例如,某個函數未通過所提供的測試之一)。
model='gpt-4o'
:控制要查詢的LLM模型
timeout_seconds=0
:設定單一 Pythoness 嘗試逾時的時間量。預設情況下,沒有超時。
verbose=False
:將其設為True
以使 Pythoness 在產生和驗證程式碼時輸出詳細資訊。對於開發人員和密切關注進度最有用。可以使用“PYNS_VERBOSE”環境變數一次為每個函數設定。
regenerate=False
:將其設為True
以便在每次呼叫函數時產生新程式碼,而不是儲存它並重複使用它。
output=False
:將其設為True
以使 Pythoness 在第一次呼叫函數時輸出產生的程式碼。