【问题标题】:How to get macro functionality in python?如何在python中获得宏功能?
【发布时间】:2017-10-31 14:24:21
【问题描述】:

我是 python 新手,我需要创建一个列表并用数据填充它。 喜欢。

list = [  {  1: "first",2:"second"} , { i:"first",ii:"second" } ]

考虑创建宏以进行优化。 喜欢。

#define english { 1: "first",2:"second"}
#define roman { i:"first",ii:"second" }
list = [ english, roman ] 

这里有没有创建类似宏的功能?

函数不能解决问题,因为它会调用函数,但我需要替换代码。

【问题讨论】:

  • 为什么你认为你需要“宏功能”?为什么不能对englishroman 使用普通变量? (尽管请注意您的罗马字典在任一版本中都不是有效的 Python。)
  • 感谢您的回复。我刚刚创建了一个前任。 n 错过的报价。想表明我需要在列表中包含字典。正在考虑是否可以用宏之类的变量名替换字典。

标签: python macros


【解决方案1】:

足够简单:

english = { 1: "first",2:"second"}
roman = {"i": "first","ii":" second"}
# NB : don't use "list" as variable name, 
# it would shadow the builtin `list` type
langs = [english, roman]

【讨论】:

    【解决方案2】:

    在您的情况下,您应该只创建 2 个单独的字典并将它们放在列表中

    english = {1: "first",2: "second"}
    roman = {"i": "first","ii": "second"}
    li = [english, roman]
    

    我使用 li 因为 list 是 python 中的保留字。
    罗马数字周围的引号在那里,因为 i 和 ii 不是定义的变量,所以使用字符串会更好

    【讨论】:

    • 感谢您的回复。我错过了引号,想在列表中显示字典:)。
    【解决方案3】:

    有一个非常好的python模块形式的解决方案,cogapp模块。

    这是一个例子macro_test.py

    #define english { 1: "first",2:"second"}
    #define roman { i:"first",ii:"second" }
    #[[[cog
    #   import cog
    #   english = { 1   : "first",  2   : "second" }
    #   roman   = { "i" : "first", "ii" : "second" }
    #   cog.outl("mylist = [ {0!r}, {1!r} ]".format(english, roman))
    #   
    #   ## something actually usefull:
    #   import os
    #   git_command         = "git log --pretty=format:'%H' -n 1"
    #   release_git_version = os.popen(git_command).read()
    #   ## Note how release_git_version string contains quote char at start and at the end
    #   cog.outl("release_git_version = {}".format(release_git_version))
    #]]]
    #[[[end]]]
    
    print("mylist = {}".format(mylist))
    print("release_git_version = {}".format(release_git_version))
    

    然后你像这样运行预处理器:

    python -m cogapp -r macro_test.py
    

    并且由于-r 选项macro_test.py 源被重写为:

    #define english { 1: "first",2:"second"}
    #define roman { i:"first",ii:"second" }
    #[[[cog
    #   import cog
    #   english = { 1   : "first",  2   : "second" }
    #   roman   = { "i" : "first", "ii" : "second" }
    #   cog.outl("mylist = [ {0!r}, {1!r} ]".format(english, roman))
    #   
    #   ## something actually usefull:
    #   import os
    #   git_command         = "git log --pretty=format:'%H' -n 1"
    #   release_git_version = os.popen(git_command).read()
    #   ## Note how release_git_version string contains quote char at start and at the end
    #   cog.outl("release_git_version = {}".format(release_git_version))
    #]]]
    mylist = [ {1: 'first', 2: 'second'}, {'i': 'first', 'ii': 'second'} ]
    release_git_version = '340b5c2f85c7070f236161d14db07a74ab9abdcb'
    #[[[end]]]
    
    print("mylist = {}".format(mylist))
    print("release_git_version = {}".format(release_git_version))
    

    对于代码生成非常有用。现在,当您运行 macro_test.py 脚本时,会有正确的输出:

    >python macro_test.py
    mylist = [{1: 'first', 2: 'second'}, {'i': 'first', 'ii': 'second'}]
    release_git_version = 340b5c2f85c7070f236161d14db07a74ab9abdcb
    

    我添加了release_git_version 代码位以显示有用性,因为其他答案试图将此问题视为无稽之谈。

    请注意,生成这样的代码并不是优化性能的正确方法。 Python 解释器仍然需要解析生成的代码。如果您使用的是 CPython,那么优化通常通过在 C/C++ 中重新实现瓶颈代码来实现。

    cogapp 也适用于其他语言、XML 或 JSON 的代码。更多详情here

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      相关资源
      最近更新 更多