将Python *参数列表传递给对象是在一个方法内部而不是另一个方法中进行的吗?

时间:2014-12-01 03:21:15

标签: python django list arguments args

我试图将一个参数列表传递给Django crispy表单Tab()类。 首先,我从btn_list输入构建一些按钮,并尝试将其传递回辅助对象。 我能够在第一个示例中完成此工作,其中我返回整个Tab()对象。但我有点困惑,为什么我不能将Div()对象作为一个列表返回,然后将它们作为参数传递给帮助器中的Tab()对象呢?似乎当我在助手python中使用星号时会出现语法错误。 有什么想法吗?

def build_button_list(btn_list):#generates a list of buttons from the given input
    base_fmt = 'btn btn-block '
    btn_layout = []
    for btn in btn_list:
        btn_layout.append(  Div( HTML("<b>"+btn['title']+"</b>"), \
                            Div(
                                Button('BtnProfile1', 'Persional Information', onclick="location.href='"+btn['link']+"'",
                                    css_class=base_fmt+btn['size']+" "+btn['style']),
                                css_class="row",
                                )
                            )
                         )

    return Tab('tab name', *btn_layout) #NOTICE THE ASTERISK * !!!! 

class gettingStarted(forms.Form):
    ....
    ....
    btn_list = [blah,blah]

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.layout = Layout(
             TabHolder(
                  build_button_list( btn_list ), #makes a list of formatted buttons
             )
        )

然而,当我尝试更改布局并在gettingStarted()。 init ()方法而不是make_button_list()方法中添加Tab对象时,python会抱怨语法错误并且不会接受使用星号:

def build_button_list(btn_list):
    base_fmt = 'btn btn-block '
    btn_layout = []
    for btn in btn_list:
        btn_layout.append(  Div( HTML("<b>"+btn['title']+"</b>"), \
                            Div(
                                Button('BtnProfile1', 'Persional Information', onclick="location.href='"+btn['link']+"'",
                                    css_class=base_fmt+btn['size']+" "+btn['style']),
                                css_class="row",
                                )
                            )
                         )
    return btn_layout

class gettingStarted(forms.Form):
    ....
    ....
    btn_list = [blah,blah]

    def __init__(self, *args, **kwargs):
        self.helper = FormHelper()
        self.helper.layout = Layout(
                   # SYNTAX ERROR???
                   Tab(
                       'tab name', 
                       *build_button_list( btn_list ), #NOTICE THE ASTERISK *
                      ),
        )

谢谢!

1 个答案:

答案 0 :(得分:2)

好的,当传递* args时你不能有一个尾随的逗号。我没有注意到它,并一直想知道为什么当我添加一个星号python会抱怨并且当我删除它时不会抱怨。因此,我提出这个原因的原因是可怜的小星号的错误,因为我留在那里的那个偷偷摸摸的逗号,这是有道理的,因为星号实际上做了什么:)

所以只是为了澄清这一点现在按预期工作:

def __init__(self, *args, **kwargs):
    self.helper = FormHelper()
    self.helper.layout = Layout(
               Tab(
                   'tab name', 
                   *build_button_list( btn_list ) #NOTICE THE COMMA IS GONE!
                  ),
    )