Пифинесса: жрица оракула Аполлона в Дельфах.
Pythoness Эмери Бергера, расширение Кайла Гвилта и Стивена Фройнда
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-е число в ряду Фибоначчи. Чтобы фактически выполнить функцию, вы можете вызвать ее так же, как и любую другую функцию 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 запустит тестер на основе свойств (гипотеза), который будет выполнять тесты много раз, чтобы убедиться, что сгенерированная функция соответствует указанным свойствам. Этот подход гораздо более мощный, чем описанные выше модульные тесты.
@ 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 являются последним вариантом тестирования, и их можно использовать, предоставив Pythoness TestCases или модуль TestCases:
@ pythoness . spec ( "Compute the nth number in the Fibonacci series." , tests = [ testmodule . TestFib ])
def myfib ( n : int ) -> int :
""
Вы можете дополнительно направлять 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 выдавал сгенерированный код при первом вызове функции.