代码之家  ›  专栏  ›  技术社区  ›  user78706

在Python中,是否有将代码转换为字符串的方法,反之亦然?

  •  3
  • user78706  · 技术社区  · 15 年前

    最初的问题是:

    是否有一种方法可以像在C中声明宏那样在python中声明宏:

    #define OBJWITHSIZE(_x) (sizeof _x)/(sizeof _x[0])
    

    我想知道的是:

    有没有办法避免Python中的代码重复? 在我正在编写的程序的一部分中,我有一个函数:

    def replaceProgramFilesPath(filenameBr):
      def getProgramFilesPath():
        import os
        return os.environ.get("PROGRAMFILES") + chr(92)
      return filenameBr.replace("<ProgramFilesPath>",getProgramFilesPath() )
    

    在另一部分中,我将这个代码嵌入到一个字符串中,稍后
    输出到将自身运行的python文件:

    """
    def replaceProgramFilesPath(filenameBr):
      def getProgramFilesPath():
        import os
        return os.environ.get("PROGRAMFILES") + chr(92)
      return filenameBr.replace("<ProgramFilesPath>",getProgramFilesPath() )
    """
    

    我如何才能构建一个避免这种重复的“宏”?

    7 回复  |  直到 15 年前
        1
  •  2
  •   Gary Kerr    15 年前

    回答新问题。

    在第一个python文件中(例如, first.py ):

    import os
    
    def replaceProgramFilesPath(filenameBr):
      new_path = os.environ.get("PROGRAMFILES") + chr(92)
      return filenameBr.replace("<ProgramFilesPath>", new_path)
    

    在第二个python文件中(例如, second.py ):

    from first import replaceProgramFilesPath
    # now replaceProgramFilesPath can be used in this script.
    

    注意 第一。 需要在python的模块搜索路径中或与 第二 你可以在 第二 .

        2
  •  3
  •   Greg Hewgill    15 年前

    不,python不支持C这样的预处理器宏。但是,您的示例在python中不需要做;您可以考虑提供一个相关的示例,这样人们就可以建议一种蟒蛇式的方式来表达您的需要。

        3
  •  2
  •   manifest    15 年前

    虽然似乎有一个用于python预处理的库 pypp 我不太熟悉。实际上没有针对Python内置的预处理功能。python代码被转换成字节代码,没有中间步骤。如果您是Python初学者,我建议您完全避免使用Pypp。

    最接近宏的等价物可能是定义一个全局函数。与C样式宏等效的python可能是:

    import sys
    OBJWITHSIZE = lambda x: sys.getsizeof(x) / sys.getsizeof(x[0])
    aList = [1, 2, 4, 5]
    size = OBJWITHSIZE(aList)
    print str(size)
    

    注意,很少需要获得Python对象的大小,因为所有的分配和删除都是在Python中为您处理的,除非您做了一些非常奇怪的事情。

    除了使用lambda函数,您还可以执行以下操作:

    import sys
    def getSize(x):
       return sys.getsizeof(x) / sys.getsizeof(x[0])
    
    OBJWITHSIZE = getSize
    aList = [1, 2, 4, 5]
    size = OBJWITHSIZE(aList)
    print str(size)
    

    基本上是一样的。

    正如前面提到的,您的示例宏在Python中是多余的,因为您可以简单地编写:

    aList = [1, 2, 4, 5]
    size = len(aList)
    print str(size)
    
        4
  •  2
  •   Mike Graham    15 年前

    语言级别不支持此功能。在python中,您通常使用一个普通函数或一个普通变量,其中您可能使用C中的a define。

        5
  •  2
  •   TerryP    15 年前

    一般来说,如果要将字符串转换为python代码,请使用eval。在python中很少需要eval。在标准库中的某个地方有一个模块可以告诉您一些关于对象代码的信息(在interp中不起作用),我从未直接使用过它。你可以在comp.lang.python上找到解释它的东西。

    至于“c”宏,它似乎是您问题的真正焦点。

    清喉咙 不要在Python代码中使用C宏。

    1. 如果您只需要一个C宏,请使用C预处理器预处理脚本。杜赫。

    2. 如果您想要包含,它被称为导入。

    3. 如果要定义,请使用不可变对象。认为const int foo=1;而不是定义foo 1。有些对象是不可变的,比如元组。您可以编写一个使变量充分不可变的函数。在网上搜索一个例子。我更喜欢静态类。

    4. 如果你想要foo(x,y)……代码…;学习如何使用函数和类。

    “cpp”宏在python中的大多数使用都可以通过编写函数来完成。你可能想买本书 higher order functions 以处理更复杂的案件。我个人喜欢一本叫做高阶Perl(hop)的书,虽然它不是基于Python的,但大多数书都包含了独立于语言的思想——这些思想应该是每个程序员都需要学习的。

    出于所有的意图和目的,在Python中只需要使用C预处理器,而不是在框外提供的C预处理器是能够定义常量的能力,即使在C和C++中也经常出错。

    现在以一种聪明的方式在python中实现lisp宏,并且实际上需要它们… 清嗓子扫地毯下 .

        6
  •  0
  •   Marco Mariani    15 年前

    好吧,对于勇敢的人来说,有超巨蟒:

    http://code.google.com/p/metapython/wiki/Tutorial

    For instance, the following MetaPython code:
    
    $for i in range(3):
        print $i
    
    will expand to the following Python code:
    
    print 0
    print 1
    print 2
    

    但如果您刚开始使用Python,可能不需要它。只要继续练习通常的动态特性(duck类型、可调用对象、修饰器、生成器…),您就不会觉得需要C样式的宏了。

        7
  •  0
  •   John La Rooy    15 年前

    您可以将其写入第二个文件,而不是复制代码字符串

    """
    from firstFile import replaceProgramFilesPath
    """