Как передать список в функцию arg для того, чтобы быть читаемым в SQL? - PullRequest
1 голос
/ 06 июня 2019

Я использую модуль SQL в psycopg2 и пытаюсь передать список в виде функции arg.

def getSomething(*args):

 query = sql.SQL("select col1 from tb1 where col1 in ({})").format(
        sql.SQL(', ').join([sql.Literal(ar) for ar in args])
    )
 print query.as_string(Connection())

Пробовали по-разному, но безуспешно.Один из них был, я получил тип Unicode через POST.

data = request.form['data']
d_array = data.split(',')
print getsomething(d_array)

output d_array [u'66626', u'66635']

InvalidTextRepresentation('invalid input syntax for integer: "66626,66635"\nLINE 9:     WHERE col1 in (\'66626,66635\')\n                               ^\n',)

Если я передам эти значения отдельно getSomething('66626','66635') работает!

У меня вопрос о том, чтобы распаковать этот список в отдельных значениях и поместить их в функцию как arg, или есть другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Как упомянуто в комментариях, * в python является оператором распаковки , т.е. он распаковывает последовательность, если установлен как параметр функции, он эффективно позволяет передавать распакованную последовательность (т. Е. Многочисленныепеременные и все они будут доступны в теле функции как определенное имя.), однако при передаче функции в качестве аргумента она распаковывает последовательность и передает ее функции как каждому элементу в отдельности.

In [1]: def starred(*args): 
   ...:     print(type(args)) 
   ...:     print(args) 
   ...:                                                                         

In [2]: def pass_starred(arg1, arg2, arg3): 
   ...:     print(arg1, arg2, arg3) 
   ...:                                                                         

In [3]: data = [1, 2, 3]                                                        

In [4]: starred(data)                                                           
<class 'tuple'>
([1, 2, 3],)

In [5]: pass_starred(*data)                                                     
1 2 3

(кстати, если вы посмотрите на функцию print, это то, как она может печатать любое количество аргументов, фактически она получает все неименованные аргументы в виде помеченной переменной, итерирует и печатает их.)

1 голос
/ 06 июня 2019

"*" - это оператор распаковки в Python.

Вам не нужно распаковывать параметр, если этот параметр является списком.

Просто удалите «*» перед именем параметра.

...