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

如何在传递参数时调用保留引号?

  •  1
  • klutt  · 技术社区  · 5 年前

    这个问题已经有了答案:

    我有一段代码是这样的。当然,真正的代码要长得多。我把它缩短了,使之浓缩成这个想法。

    #!/usr/bin/python
    
    from sys import argv
    
    class Base():
        def whoami(self):
            print(self.__class__.__name__)
    
        def foo(self, a, b):
            print(a+b)
    
    class A(Base):
        def bar(self, a):
            print(a)
    
    class B(Base):
        def fizz(self, a, b):
            print(a+b)
    
    def main():
        eval(argv[1] + '().' + argv[2] + '(' + ', '.join(argv[3:]) + ')')
    
    if __name__ == "__main__":
        main()
    

    预期产量:

    $ ./myScript.py A whoami
    A
    $ ./myScript.py B fizz 5 7
    12
    $ ./myScript.py B fizz '5' '7'
    57
    

    但最后一行的实际输出是:

    $ ./myScript.py B fizz '5' '7'
    12
    

    引用不通过。我的目标是能够从命令行轻松地调用各种类方法进行调试。我一开始就不知道我的方法是不是错了。

    是的,我知道 eval .我打算在代码投入生产时删除它。

    1 回复  |  直到 5 年前
        1
  •  3
  •   willeM_ Van Onsem    5 年前

    引用不通过。我的目标是能够从命令行轻松地调用各种类方法进行调试。

    引用的是 使用的部分参数。引号由shell解释。通常,引号用于向参数添加空格。

    例如:

    command foo bar
    

    将传递两个参数( foo bar ) command ,但如果要添加空格,可以使用:

    command 'foo bar'
    

    现在shell将其解释为一个带空格的参数。

    但是,您可以在参数中添加引号,例如:

    command '"foo"' '"bar"'
    

    或:

    command "'foo'" "'bar'"
    

    用引号(双引号)传递值 " 在第一个例子和单引号中 ' 在第二个命令中)。也可以转义部分参数,如 command "\"Thank you\", she said." ,因此在同一参数中使用双引号和单引号。

    有人这么说,拜托 使用 eval(..) 计算字符串。 评估(…) 存在严重的安全风险,请参见 Security of Python's eval() on untrusted strings? 更多信息。你可以用 ast.literal_eval [python-doc] 评估文字。此外,还可以使用字典等将调用路由到正确的函数。