【发布时间】:2021-06-24 15:20:05
【问题描述】:
我想拉皮条 format_html() 的 Django。
它已经很好地工作了,但是我的 IDE (PyCharm) 认为这些变量没有被使用,并将它们涂成浅灰色:
AFAIK f-strings 使用了一些神奇的重写。
有没有办法实现这一点,让 IDE 知道变量被使用了?
相关:Implement f-string like syntax, with Django SafeString support
这是我当前的实现:
def h(html):
"""
Django's format_html() on steroids
"""
def replacer(match):
call_frame = sys._getframe(3)
return conditional_escape(
eval(match.group(1), call_frame.f_globals, call_frame.f_locals))
return mark_safe(re.sub(r'{(.*?)}', replacer, html))
有人提出了安全问题:我不打算创建用户可以编辑这些模板的 CMS。这些模板 h-strings 仅供开发人员方便地创建 HTML。
在写答案之前,请确保您了解conditional_escape() 的魔力
【问题讨论】:
-
那些电话看起来不对 - 你不应该这样做
format_html('<span>{foo}</span>', foo=foo)吗? -
这不是“魔法”——f-strings 是一种实际的语言功能,因此 JetBrains 的开发人员在 IDE 中实现了它的逻辑(请参阅youtrack.jetbrains.com/issue/PY-18972 和一系列其他相关问题给它)。我猜想,去寻找任何可能在给定范围内引用变量以将其标记为未使用的框架黑客的使用,这将被认为超出了他们的责任。
-
我相信您的选择是: 1. 禁用未使用的局部变量检查。 2. 为 PyCharm 编写一个插件,当你使用你的函数时抑制这个检查。 (可能通过添加一个特殊的注释并使用
com.intellij.lang.inspectionSuppressor扩展点来实现) 3. 编写一个插件,找出模板中使用的内容,并仅将这些变量标记为已使用。 4. 传递locals()作为第二个参数,如h('{a}', locals())以在这种情况下使用PyCharm 异常。对嵌套函数和globals()没有帮助 -
我用 VSCode 尝试过这个,突出显示效果如你所料。不知道为什么 PyCharm 会有所不同
-
例如,
string.Formatter().parse可以为您解析格式模板并正确处理转义结构,例如{{。
标签: python django pycharm f-string