2013-09-13 1 views
0

У меня есть программа, которая имеет update_database() функцию, но я не знаю, что именованные аргументы не будет до выполнения, поэтому один раз, когда функция называется это, возможно, потребуется:Передача аргументов пользовательских ключевых слов в функции

table_name = 'example1' 
update_database(table_name, column1='...', column3='...') 

, но в другой раз это может быть:

table_name = 'example2' 
update_database(table_name, column5='...', column2='...') 

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

Кто-нибудь знает, если/как это возможно?

UPDATE:

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

+0

См., Например, [этот старый вопрос] (http://stackoverflow.com/questions/1098549/proper-way-to-use-kwargs-in-python). –

ответ

3

Вы всегда можете использовать неопределенное количество аргументов ключевых слов в исходной функции, как:

(В случае именованных аргументов, то есть простой словарь вместо списка)

def update_database(tname, **columns): 
    for key, value in columns.items(): 
     # do something with key-value pairs 

UPDATE:

Так что я думаю, это то, что мы говорим о в комментариях секте ион, я прав?

# Create dictionaries with keys as keywords and values as argument values 
kwargs0 = {'arg0': 0, 'arg1': 2, 'arg2': 5} 
kwargs1 = {'arg99': 1, 'arg13': None, 'arg0': 7} 

# Call the function and UNPACK the dictionaries 
update_database('db_name', **kwargs0) 
update_database('db_name', **kwargs1) 
+0

К сожалению, у меня нет возможности изменить определение как 'update_database()' функция из внешнего модуля –

+0

Я могу показать вам, как обернуть функцию другим, но я не совсем уверен, что такое цель, которую вы хотите достичь. Вы хотите переименовать ключевые слова, прежде чем перейти к этой функции «update_database»? Или вы хотите отфильтровать их, чтобы передать только некоторые ключевые слова? Или? –

+0

Скажем, у меня есть dict 'keywords = {'arg1': 'value', 'arg2': 'value'}', я бы хотел использовать этот dict в качестве аргумента для функции, например: 'update_database ('db_name ', args = keywords) ', а не' update_database (' db_name ', arg1 =' значение ', arg2 =' значение ') ', поскольку эти аргументы могут меняться во время выполнения, я надеюсь, что это имеет смысл –