Pythoness : นักบวชหญิงแห่งพยากรณ์ของอพอลโลที่เดลฟี
Pythoness โดย Emery Berger ส่วนขยายโดย Kyle Gwilt และ Stephen Freund
Pythoness จะสร้างโค้ด Python โดยอัตโนมัติจากคำอธิบายและการทดสอบภาษาธรรมชาติ
หมายเหตุ Pythoness จำเป็นต้องเชื่อมต่อกับ LLM เพื่อให้สามารถทำงานได้ ด้านล่างนี้เป็นตัวอย่างวิธีเชื่อมต่อ Pythoness กับบัญชี OpenAI สำหรับ LLM อื่นๆ โปรดดูเอกสารประกอบของพวกเขา
บัญชี OpenAI บัญชีของคุณจะต้องมียอดคงเหลือเป็นบวกจึงจะใช้งานได้ (ตรวจสอบยอดเงินคงเหลือของคุณ) หากคุณไม่เคยซื้อเครดิต คุณจะต้องซื้อเครดิตอย่างน้อย 1 ดอลลาร์ (หากบัญชี API ของคุณสร้างขึ้นก่อนวันที่ 13 สิงหาคม 2023) หรือ 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 :
""
โค้ดนี้จะสร้างฟังก์ชัน Python ภายในชื่อ myfib
ซึ่งคำนวณเลขลำดับที่ n ในชุด Fibonacci หากต้องการรันฟังก์ชันจริง คุณสามารถเรียกมันได้เหมือนกับที่คุณเรียกใช้ฟังก์ชัน 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 :
""
TestCases จาก unittest framework ในตัวเป็นตัวเลือกสุดท้ายสำหรับการทดสอบ และสามารถใช้ได้โดยให้ Pythoness TestCases หรือโมดูลของ TestCases:
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [ testmodule . TestFib ])
def myfib ( n : int ) -> int :
""
คุณสามารถแนะนำ Pythoness เพิ่มเติมได้โดยให้ฟังก์ชันและคลาสที่เกี่ยวข้องกับโค้ดที่มันจะสร้างขึ้น ใช้หลักคำสอนของฟังก์ชันและคลาสที่ให้มาเพื่อทำความเข้าใจวัตถุประสงค์ Pythoness สามารถใช้ฟังก์ชันที่จะสร้างขึ้นเองด้วยวิธีนี้ โดยระบุ docstring ใน 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 :
""
เมื่อทำงานกับคลาส วิธีที่ดีที่สุดคือใช้ฟีเจอร์ __slots__
ของ Python แม้ว่า 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 ส่งออกโค้ดที่สร้างขึ้นในครั้งแรกที่เรียกใช้ฟังก์ชัน