【问题标题】:Meaning of "SyntaxError: non-default argument follows default argument"“语法错误:非默认参数遵循默认参数”的含义
【发布时间】:2020-05-04 14:00:14
【问题描述】:

我对python中的类有点乱,我从网上得到一个类代码,但是当我对代码进行更改时,我得到了错误

语法错误:非默认参数遵循默认参数。

按照下面的代码:

class button():
    def __init__(self, color, x, y, width, height, text='',color_font): #the problem is color_font argument
        self.color = color
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.text = text
        self.color_font = color_font

为什么会出现这个错误?我在 __init__ 函数中引用了 color_font,因此它应该在这个链接后面起作用:https://www.w3schools.com/python/python_classes.asp

【问题讨论】:

  • 因为color_font是一个非默认参数,它跟在text之后,这是一个默认参数(='')。
  • 这与类无关,任何类型的函数定义都会出现同样的问题。
  • @jasonharper 什么是非默认参数?
  • 我建议保持font_color最右边,看我的回答。
  • @LucasVital 错误不是说 non-default parameter 而是 non-default argument -- arguments 是你传递给函数的值,当你调用它,如果你不传递参数,python 会尝试为给定参数找到一个默认参数。

标签: python


【解决方案1】:

您需要将参数text='' 放在所有可选参数(即没有默认值的参数)之后。来自the documentation

如果一个参数有一个默认值,那么直到“*”之前的所有参数也必须有一个默认值——这是语法上没有表达的句法限制。

class button():
    def __init__(self, color, x, y, width, height, color_font, text=''):
        ...

【讨论】:

  • 这样看来用处不大。看起来color_font 是按钮文本的颜色。您将如何从空的默认 text 与不同字体颜色的组合中受益?
  • @Wolf 考虑到我们甚至看不到所有代码,这似乎有点脱离了问题的背景。如果传入空字符串,也许有代码将按钮文本设置为特定字符串。也许字体的颜色决定了其他行为,例如按钮边框的颜色。如果color_font 实际上对text == '' 无效,那么是的,也许它也应该是一个可选参数。
  • 对我来说,color_fonttext 之间的关系在 button 类的情况下非常明显,而且您似乎对待术语 parameter 和 argument 作为同义词,它们不是。我确信有问题的错误消息措辞谨慎。
【解决方案2】:

默认参数是分配给函数(在您的情况下为__init__)中的形式参数(在您的情况下为text)的值(在您的情况下为'') ; 非默认参数意味着正式的parameter(在您的情况下为color_font)缺少这样的默认argument

Python 仅在参数列表的末尾支持默认参数,因此您可以使用最少的参数调用函数。

通常,在设计函数时(__init__ 也是如此),您选择的参数顺序带有默认参数,最专业的选项位于最右边。这就是为什么我建议向font_color 添加一个默认参数并将其保留为最后一个参数。更有可能的是,您有很多按钮具有不同的text,并且没有那么多不同的字体颜色,而是默认的text 是空的。

换句话说,将您的代码更改为以下内容

class button():
    def __init__(self, color, x, y, width, height, text='', color_font='black'):
        self.color = color
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.text = text
        self.color_font = color_font

有用的默认参数

默认参数可以使调用函数更容易。 对我来说,这看起来还不错

button('gray', 4, 4, 64, 16, 'one', 'red')
button('gray', 4, 24, 64, 16, 'two')
button('gray', 4, 44, 64, 16, 'three')

但这看起来有点奇怪

button('gray', 4, 4, 64, 16, 'red', 'hello')
button('gray', 4, 24, 64, 16, 'blue')
button('gray', 4, 44, 64, 16, 'green')

text(不同字体颜色)为空时。当然,你的课堂还有更多的优化空间,想想colorheight 的重复潜力。

还有一条建议

尽可能多地阅读错误消息,并仔细阅读

语法错误:非默认参数遵循默认参数。

该错误并未告诉您非默认参数,而是非默认参数。参数是你在调用函数时传递给函数的值,如果你没有在属于参数的地方传递参数,python 使用 默认参数 它,如果它找不到这样的,它会引发错误。这就是为什么带有默认参数的参数在没有的参数之前没有意义的原因:强制参数(没有默认参数的参数)按位置匹配它们的参数,为了达到这个位置,你必须在它之前放置正确数量的参数, 默认参数永远不会以这种方式使用。

【讨论】:

    【解决方案3】:

    问题在于构造函数中有一个默认参数传递给text。 Python 不允许您在具有默认值的参数之后使用没有默认值的函数参数。

    交换他们的位置:

    class button():
        def __init__(self, color, x, y, width, height, color_font, text=''): 
            self.color = color
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.text = text
            self.color_font = color_font
    

    【讨论】:

      猜你喜欢
      • 2019-12-14
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2018-06-30
      • 1970-01-01
      相关资源
      最近更新 更多