Pythoness: Die Priesterin des Orakels von Apollo in Delphi.
Pythoness von Emery Berger, Erweiterung von Kyle Gwilt und Stephen Freund
Pythoness generiert automatisch Python-Code aus Beschreibungen und Tests in natürlicher Sprache.
Hinweis Pythoness muss mit einem LLM verbunden sein, um zu funktionieren. Nachfolgend finden Sie ein Beispiel für die Verbindung von Pythoness mit einem OpenAI-Konto. Informationen zu anderen LLMs finden Sie in deren Dokumentation.
OpenAI-Konto. Damit dies funktioniert, muss Ihr Konto einen positiven Kontostand aufweisen (überprüfen Sie Ihren Kontostand). Wenn Sie noch nie Credits erworben haben, müssen Sie Credits im Wert von mindestens 1 $ (wenn Ihr API-Konto vor dem 13. August 2023 erstellt wurde) oder 0,50 $ (wenn Sie ein neueres API-Konto haben) erwerben. Holen Sie sich hier einen Schlüssel.
Sobald Sie einen API-Schlüssel haben, legen Sie ihn als Umgebungsvariable mit dem Namen
OPENAI_API_KEY
fest.export OPENAI_API_KEY= < your-api-key >
Der einfachste Weg, Pythoness zu installieren, ist über pip:
python3 -m pip install pythoness
Um Pythoness zu verwenden, importieren Sie einfach das pythoness
-Modul und verwenden dann den @pythoness.spec
-Dekorator, um die gewünschte Funktionalität anzugeben:
import pythoness
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." )
def myfib ( n : int ) -> int :
""
Dieser Code generiert intern eine Python-Funktion namens myfib
, die die n-te Zahl in der Fibonacci-Reihe berechnet. Um die Funktion tatsächlich auszuführen, können Sie sie wie jede andere Python-Funktion aufrufen:
for i in range ( 20 ):
print ( myfib ( i ))
Pythoness speichert die Ergebnisse der Übersetzung natürlicher Sprache in Python zwischen, sodass nachfolgende Ausführungen im selben Verzeichnis viel schneller ausgeführt werden (Pythoness erstellt eine Datenbank namens pythoness-cache.db
die diese Übersetzungen speichert).
Um alle Protokollierungsmeldungen zu deaktivieren, verwenden Sie die Umgebungsvariable PYNS_QUIET
:
env PYNS_QUIET=1 python3 myfib.py
Sie können Pythoness durch die Bereitstellung einiger Tests unterstützen. Pythoness verwendet Tests sowohl zum Generieren des Python-Codes als auch zu seiner Validierung. Tests sind lediglich eine Liste von Zeichenfolgen mit Python-Code oder -Funktionen, die alle als True
ausgewertet werden sollten.
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." ,
tests = [ "myfib(1) == 1" , "myfib(2) == 1" ])
def myfib ( n : int ) -> int :
""
Sie können Pythoness auch mit eigenschaftsbasierten Tests unterstützen. Beschreiben Sie dazu die Eigenschaften, die Ihr Programm aufweisen soll. Pythoness führt einen eigenschaftsbasierten Tester (Hypothese) aus, der viele Male Tests durchführt, um sicherzustellen, dass die generierte Funktion die angegebenen Eigenschaften erfüllt. Dieser Ansatz ist viel leistungsfähiger als die oben beschriebenen Unit-Tests.
@ 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 :
""
Testfälle aus dem integrierten Unittest-Framework sind die letzte Testoption und können durch Angabe von Pythoness TestCases oder einem Modul von TestCases verwendet werden:
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [ testmodule . TestFib ])
def myfib ( n : int ) -> int :
""
Sie können Pythoness weiter leiten, indem Sie ihm Funktionen und Klassen zuweisen, die sich auf den Code beziehen, den es generieren wird. Es verwendet die Dokumentzeichenfolge der bereitgestellten Funktionen und Klassen, um deren Zweck zu verstehen. Pythoness kann auf diese Weise von sich selbst generierte Funktionen nutzen, wobei der Docstring in spec
angegeben ist.
related_objs
ist eine Liste, die Funktionen, Klassen oder spezielle Zeichenfolgen enthalten kann:
'cls'
das außer sich selbst alles in der Klasse darstellt, in der die generierte Funktion enthalten ist'*'
das außer sich selbst alles in der Datei darstellt, in der die generierte Funktion enthalten ist @ 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 :
""
Wenn Sie mit Klassen arbeiten, verwenden Sie am besten die __slots__
Funktion von Python. Während Pythoness auch ohne funktionieren kann, erhöht dies die Konsistenz von Pythoness.
Sie können Pythoness die Spezifikation direkt in Ihrer Datei durch die generierte Funktion ersetzen lassen: Fügen Sie einfach „replace=True“ hinzu:
@ 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 hat beispielsweise diesen Code erstellt:
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
Sie können jede generierte Funktion auch mithilfe der Umgebungsvariablen „PYNS_REPLACE“ ersetzen:
env ' PYNS_REPLACE ' =1
Pythoness bietet einige andere Möglichkeiten, sein Verhalten zu steuern. Dies sind alles Argumente für spec
. Die bereitgestellten Werte geben den Standardwert an.
max_retries=3
: Steuert die maximale Anzahl von Wiederholungsversuchen aufgrund von Fehlern (z. B. eine Funktion, die einen der bereitgestellten Tests nicht besteht).
model='gpt-4o'
: steuert, welches LLM-Modell abgefragt werden soll
timeout_seconds=0
: Legt die Zeit fest, die bei einem einzelnen Pythoness-Versuch bis zum Timeout dauert. Standardmäßig gibt es keine Zeitüberschreitung.
verbose=False
: Setzen Sie dies auf True
, damit Pythoness Details ausgibt, während Code generiert und validiert wird. Vor allem nützlich für Entwickler und um den Fortschritt im Auge zu behalten. Kann für jede Funktion gleichzeitig mit der Umgebungsvariablen „PYNS_VERBOSE“ festgelegt werden.
regenerate=False
: Setzen Sie dies auf True
um bei jedem Aufruf einer Funktion neuen Code zu generieren, anstatt ihn zu speichern und wiederzuverwenden.
output=False
: Setzen Sie dies auf True
, damit Pythoness den generierten Code beim ersten Aufruf der Funktion ausgibt.