gpt4 book ai didi

验证参数的 Pythonic 方法是一个序列而不是字符串

转载 作者:太空狗 更新时间:2023-10-29 22:23:55 26 4
gpt4 key购买 nike

我有一个函数获取数据库表的列表作为参数,并返回要在这些表上执行的命令字符串,例如:

pg_dump( file='/tmp/dump.sql',
tables=('stack', 'overflow'),
port=5434
name=europe)

应该返回如下内容:

pg_dump -t stack -t overflow -f /tmp/dump.sql -p 5434 europe

这是使用 tables_string='-t '+' -t '.join(tables) 完成的。

当使用以下函数调用函数时,乐趣就开始了:tables=('stackoverflow')(一个字符串)而不是 tables=('stackoverflow',)(一个元组),产生:

pg_dump -t s -t t -t a -t c -t k -t o -t v -t e -t r -t f -t l -t o -t w
-f /tmp/dump.sql -p 5434 europe

因为字符串本身正在被迭代。

This SO question建议在类型上使用断言,但我不确定它是否足够 Pythonic,因为它打破了鸭子类型(duck typing)约定。

有什么见解吗?

亚当

最佳答案

断言类型在这种情况下似乎是合适的 - 处理由于 duck typing 而看似合法的常见误用。

处理这种常见情况的另一种方法是测试字符串并将其作为特殊情况正确处理。

最后,您可以鼓励将表名作为位置参数传递,这将降低这种情况的可能性:

def pg_dump(*tables, **kwargs):
file = kwargs['file']
port = kwargs['port']
name = kwargs['name']
...

pg_dump('stack', 'overflow', file='/tmp/dump.sql', port=5434, name='europe')

关于验证参数的 Pythonic 方法是一个序列而不是字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4237434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com