验证参数的Pythonic方法是序列但不是字符串

Ada*_*tan 6 python duck-typing

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

pg_dump( file='/tmp/dump.sql',
         tables=('stack', 'overflow'),
         port=5434
         name=europe)
Run Code Online (Sandbox Code Playgroud)

应该返回类似的东西:

pg_dump -t stack -t overflow -f /tmp/dump.sql -p 5434 europe
Run Code Online (Sandbox Code Playgroud)

这是使用完成的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
Run Code Online (Sandbox Code Playgroud)

因为字符串本身正在迭代.

这个SO问题建议在类型上使用断言,但我不确定它是否足够Pythonic,因为它打破了鸭式约定.

任何见解?

亚当

ori*_*rip 6

在这种情况下,断言这种类型似乎是合适的 - 处理由于鸭子打字而看起来合法的常见滥用.

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

最后,您可以鼓励将表名作为位置参数传递,这将使此方案不太可能:

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')
Run Code Online (Sandbox Code Playgroud)