2014-10-08 72 views
0

我有一個函數,它具有多個函數,所有這些函數都帶有2個必需參數和許多可選參數。我想知道如何在這個函數中設置可選的參數給定函數:Python:爲函數中的函數設置參數

chart_type = "bar" 

def chart_selector(slide, df_table, chart_type): 

    if chart_type == "bar": 
     add_bar_chrt(slide, df_table) 
    elif chart_type == "column": 
     add_column_chrt(slide, df_table) 
    elif chart_type == "pie": 
     add_pie_chrt(slide, df_table) 
    elif chart_type == "line": 
     add_line_chrt(slide, df_table) 

這裏是我想怎麼辦:我想使用chart_selector()功能,如果chart_type"bar",然後我想要爲add_bar_chrt()函數設置幾個可選參數,但我不知道如何?

,所以我需要它以某種方式加入到這個代碼:

chart = chart_selector(slide, df_table, chart_type) 
+0

這實在是不清楚。爲什麼你不能把它們放在if語句中的add_bar_chrt的調用中? – 2014-10-08 11:21:42

+0

只需將其他參數添加到函數調用中,例如'add_bar_chrt(幻燈片,df_table,optional_arg1,optional_arg2,anotherarg = 123)' – mhawke 2014-10-08 11:22:02

+0

@ Daniel Roseman,道歉,但這個話題本身讓我感到困惑,但我相信我已經完成了你的建議? – 2014-10-08 11:24:19

回答

2

您可以通過使用*args**kwargs給你的函數簽名添加任意的論點支持,再傳給那些:

def chart_selector(slide, df_table, chart_type, *args, **kwargs): 
    if chart_type == "bar": 
     add_bar_chrt(slide, df_table, *args, **kwargs) 

任何額外您現在傳遞給chart_selector()的論點現在轉交給add_bar_chrt()

當你在這個函數的工作,無論如何,考慮使用字典派遣圖表類型:

chart_types = { 
    'bar': add_bar_chrt, 
    'column': add_column_chrt, 
    'pie': add_pie_chart, 
    'line': add_line_chart, 
} 
def chart_selector(slide, df_table, chart_type, *args, **kwargs): 
    return chart_types[chart_type](slide, df_table, *args, **kwargs) 

字典取代多分枝if .. elif ..結構。

演示:

>>> def add_bar_chrt(slide, tbl, size=10, color='pink'): 
...  return 'Created a {} barchart, with bars size {}'.format(size, color) 
... 
>>> def add_column_chrt(slide, tbl, style='corinthyan', material='marble'): 
...  return 'Created a {} column chart, with {}-style plinths'.format(material, style) 
... 
>>> chart_types = { 
...  'bar': add_bar_chrt, 
...  'column': add_column_chrt, 
... } 
>>> def chart_selector(slide, df_table, chart_type, *args, **kwargs): 
...  return chart_types[chart_type](slide, df_table, *args, **kwargs) 
... 
>>> chart_selector('spam', 'eggs', 'bar') 
'Created a 10 barchart, with bars size pink' 
>>> chart_selector('spam', 'eggs', 'column', material='gold') 
'Created a gold column chart, with corinthyan-style plinths' 
+0

使用字典替換操作符是一個好主意。現在就嘗試所有這些,並讓你知道它是怎麼回事! – 2014-10-08 11:27:26

+0

非常感謝您的時間和精力,它運作良好!現在我知道* args和** kwargs會做什麼,並會在未來嘗試使用它們。 – 2014-10-08 11:48:21