我有一段看起来像这样的代码。实际的代码当然要长得多。我已将其简化以将其浓缩为想法。
tbb::task_group tg;
// Run parallel_for in background.
tg.run( [] {
tbb::parallel_for(...);
} );
// ...
// Any other code
// ...
tg.wait(); // task_group requires to call `wait` to guarantee that all tasks are really processed
预期输出:
#!/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
带来的安全风险。我打算在代码投入生产时将其删除。
答案 0 :(得分:3)
引号没有通过。我的目标是能够从命令行轻松调用各种类方法以进行调试。
引号不是您所使用的参数的一部分。引号由外壳解释。通常,引号用于为参数添加空格。
例如:
command foo bar
会将两个参数(foo
和bar
)传递给command
,但是如果要添加空格,可以使用:
command 'foo bar'
现在,shell会将其解释为单个参数,并带有空格。
不过,您可以在参数中添加引号,例如:
command '"foo"' '"bar"'
或:
command "'foo'" "'bar'"
将带引号的值(第一个示例中的双引号"
和第二个示例中的单引号'
)传递给命令。您也可以转义部分参数,例如command "\"Thank you\", she said."
,从而在同一参数中使用双引号和单引号。
话虽如此,请不要使用eval(..)
来评估字符串。 eval(..)
具有严重的安全风险,有关更多信息,请参见Security of Python's eval()
on untrusted strings?。您可以使用ast.literal_eval
[python-doc]来评估文字。此外,您可以使用词典等将呼叫路由到正确的功能。