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 在第一次调用函数时输出生成的代码。