【问题标题】:Allowing the use of the token `class` as a named parameter in a method signature允许在方法签名中使用标记“类”作为命名参数
【发布时间】:2012-11-15 20:59:41
【问题描述】:

我有一个 python 文件,其中包含 h1imgstrong 等函数,用于样式文本。每个函数的定义如下:

def _wrapTag(tag, text, **attributes):
    out = _createTag(tag, **attributes)
    out += text
    out += "</" + tag + ">"
    return out

def _createTag(tag, **attributes):
    out = "<" + tag
    if attributes:
        for attr, value in attributes:
            out += " " + attr + "=\"" + value + "\""
    out += ">"
    return out

def h2(text, **attributes):
    return _wrapTag("h2", text, **attributes)

在理想情况下,要创建具有 modal 类的 div,我会调用 div(content, class="modal"),但 class 是受限制的关键字。有没有办法绕过这个而不给_createTag添加特殊情况?

【问题讨论】:

    标签: python python-2.7 flask


    【解决方案1】:

    PEP 8 的标准处理方式是添加尾随下划线:

    • single_trailing_underscore_:按惯例使用,以避免与 Python 关键字冲突,例如

    Tkinter.Toplevel(master, class_='ClassName')

    这是一种常见的解决方法,不会让任何人感到惊讶。你可以在你的代码中实现它:

    def _createTag(tag, **attributes):
        out = "<" + tag
        if attributes:
            for attr, value in attributes.items():
                out += " " + attr.rstrip('_') + "=\"" + value + "\""
        out += ">"
        return out
    

    以便它自动从任何和所有属性中删除额外的下划线。然后你可以打电话:

    >>> h2('contents', class_='myh2tag', id_='contenttag')
    '<h2 class="myh2tag" id="contenttag">contents</h2>'
    

    并解决两个单独的 Python 命名空间冲突,而不将其中任何一个作为特殊情况处理。

    【讨论】:

      【解决方案2】:

      没有。 Python 关键字不能用作标识符,仅此而已。这类事情的通常解决方案是使用class_ 作为名称。它需要特殊的外壳,但没有办法绕过它。

      【讨论】:

      • 呃,我感觉这可能是真的。还是谢谢你。
      【解决方案3】:
      _createTag(tag, **{"class": 1})
      

      使用此语法,您可以将任何内容传递给 **attributes。无需更改函数代码。

      【讨论】:

        猜你喜欢
        • 2012-12-04
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 2016-08-22
        相关资源
        最近更新 更多