Pythoness: Pendeta oracle Apollo di Delphi.
Pythoness oleh Emery Berger, ekstensi oleh Kyle Gwilt dan Stephen Freund
Pythoness secara otomatis menghasilkan kode Python dari deskripsi dan pengujian bahasa alami.
Catatan Pythoness harus terhubung ke LLM agar dapat berfungsi. Di bawah ini adalah contoh cara menghubungkan Pythoness dengan akun OpenAI. Untuk LLM lain, lihat dokumentasi mereka.
akun OpenAI. Akun Anda harus memiliki saldo positif agar dapat berfungsi (periksa saldo Anda). Jika Anda belum pernah membeli kredit, Anda harus membeli kredit minimal $1 (jika akun API Anda dibuat sebelum 13 Agustus 2023) atau $0,50 (jika Anda memiliki akun API yang lebih baru). Dapatkan kuncinya di sini.
Setelah Anda memiliki kunci API, tetapkan kunci tersebut sebagai variabel lingkungan bernama
OPENAI_API_KEY
.export OPENAI_API_KEY= < your-api-key >
Cara termudah untuk menginstal Pythoness adalah melalui pip:
python3 -m pip install pythoness
Untuk menggunakan Pythoness, Anda cukup mengimpor modul pythoness
dan kemudian menggunakan dekorator @pythoness.spec
untuk menentukan fungsionalitas yang diinginkan:
import pythoness
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." )
def myfib ( n : int ) -> int :
""
Kode ini secara internal akan menghasilkan fungsi Python bernama myfib
yang menghitung angka ke-n dalam deret Fibonacci. Untuk benar-benar menjalankan fungsi tersebut, Anda dapat memanggilnya seperti fungsi Python lainnya:
for i in range ( 20 ):
print ( myfib ( i ))
Pythoness menyimpan hasil terjemahan bahasa alami ke Python, sehingga eksekusi selanjutnya di direktori yang sama akan berjalan lebih cepat (Pythoness membuat database bernama pythoness-cache.db
yang menyimpan terjemahan ini).
Untuk menonaktifkan semua pesan logging, gunakan variabel lingkungan PYNS_QUIET
:
env PYNS_QUIET=1 python3 myfib.py
Anda dapat memandu Pythoness dengan memberikan beberapa tes. Pythoness akan menggunakan tes untuk menghasilkan kode Python dan memvalidasinya. Pengujian hanyalah daftar string yang berisi kode atau fungsi Python yang semuanya harus bernilai True
.
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." ,
tests = [ "myfib(1) == 1" , "myfib(2) == 1" ])
def myfib ( n : int ) -> int :
""
Anda juga dapat memandu Pythoness dengan tes berbasis properti . Untuk melakukan ini, jelaskan properti yang Anda ingin program Anda tampilkan. Pythoness akan menjalankan penguji berbasis properti (Hipotesis), yang akan melakukan pengujian berkali-kali untuk memastikan bahwa fungsi yang dihasilkan memenuhi properti yang ditentukan. Pendekatan ini jauh lebih kuat daripada pengujian unit yang dijelaskan di atas.
@ 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 dari kerangka unittest bawaan adalah opsi terakhir untuk pengujian, dan dapat digunakan dengan memberikan Pythoness TestCases atau modul TestCases:
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [ testmodule . TestFib ])
def myfib ( n : int ) -> int :
""
Anda dapat memandu Pythoness lebih lanjut dengan memberinya fungsi dan kelas yang terkait dengan kode yang akan dihasilkannya. Ia menggunakan docstring dari fungsi dan kelas yang disediakan untuk memahami tujuannya. Pythoness dapat menggunakan fungsi yang akan dihasilkan dengan sendirinya dengan cara ini, di mana docstring ditentukan dalam spec
.
related_objs
adalah daftar yang dapat mencakup fungsi, kelas, atau string khusus:
'cls'
yang mewakili semua yang ada di kelas tempat fungsi yang dihasilkan berada, selain dirinya sendiri'*'
yang mewakili semua yang ada di file tempat fungsi yang dihasilkan, selain dirinya sendiri @ 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 :
""
Saat bekerja dengan kelas, yang terbaik adalah menggunakan fitur __slots__
Python. Meskipun Pythoness dapat berfungsi tanpanya, hal ini meningkatkan konsistensi Pythoness.
Anda dapat meminta Pythoness untuk mengganti spesifikasi langsung di file Anda dengan fungsi yang dihasilkan: cukup tambahkan `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 :
""
Misalnya, Pythoness menghasilkan kode ini:
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
Anda juga dapat mengganti setiap fungsi yang dihasilkan menggunakan variabel lingkungan 'PYNS_REPLACE':
env ' PYNS_REPLACE ' =1
Pythoness menawarkan beberapa cara lain untuk mengendalikan perilakunya. Ini semua adalah argumen untuk spec
. Nilai yang diberikan menunjukkan nilai default.
max_retries=3
: mengontrol jumlah maksimum percobaan ulang karena kegagalan (misalnya, fungsi yang gagal dalam salah satu pengujian yang disediakan).
model='gpt-4o'
: mengontrol model LLM mana yang akan dikueri
timeout_seconds=0
: menetapkan jumlah waktu untuk satu upaya Pythoness untuk mencapai batas waktu. Secara default, tidak ada batas waktu.
verbose=False
: setel ini ke True
agar Pythoness mengeluarkan detail saat menghasilkan dan memvalidasi kode. Sebagian besar berguna bagi pengembang dan untuk mengawasi kemajuan. Dapat diatur untuk setiap fungsi sekaligus menggunakan variabel lingkungan 'PYNS_VERBOSE'.
regenerate=False
: setel ini ke True
untuk menghasilkan kode baru setiap kali suatu fungsi dipanggil, daripada menyimpannya dan menggunakannya kembali.
output=False
: setel ini ke True
agar Pythoness mengeluarkan kode yang dihasilkan saat pertama kali fungsi dipanggil.