我有一个函数,它获取数据库表列表作为参数,并返回要在这些表上执行的命令字符串,例如:
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
因为字符串本身正在被迭代。
这个问题 https://stackoverflow.com/questions/1835018/python-check-if-an-object-is-a-list-or-tuple-but-not-string建议在类型上使用断言,但我不确定它是否足够Pythonic,因为它打破了鸭子类型约定。
有什么见解吗?
Adam
在这种情况下,断言类型似乎是合适的——处理由于鸭子类型而看似合法的常见误用。
处理这种常见情况的另一种方法是测试字符串并将其作为特殊情况正确处理。
最后,您可以鼓励将表名称作为位置参数传递,这将减少这种情况的发生:
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')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)