Python 2.7 使用Python命令行参数作为函数名和函数值

Python 2.7 使用Python命令行参数作为函数名和函数值,python-2.7,command-line-arguments,Python 2.7,Command Line Arguments,关于这个问题 对于SYS模块,如何在代码中使用命令行参数作为函数名和函数值,而不导入其他模块 我想要一个只使用sys的解决方案。另外,请不要使用可变长度参数回答。这些令人困惑。假设命令行中只指定了函数名和一个函数变量 import sys def reversal(aaa): return aaa[::-1] a = sys.argv[1] b = sys.argv[2] print a(b) 在命令行 cpu_location$ python blah.py reversal 'abc

关于这个问题

对于SYS模块,如何在代码中使用命令行参数作为函数名和函数值,而不导入其他模块

我想要一个只使用sys的解决方案。另外,请不要使用可变长度参数回答。这些令人困惑。假设命令行中只指定了函数名和一个函数变量

import sys

def reversal(aaa): return aaa[::-1]

a = sys.argv[1]
b = sys.argv[2]

print a(b)
在命令行

cpu_location$ python blah.py reversal 'abcdefg'

Traceback (most recent call last):
File "blah.py", line 8, in <module>
print a(b)
TypeError: 'str' object is not callable
我想知道如何将sys.argv[1]视为函数名,从而调用我定义的函数

我在这篇文章中看到的其他帖子是: -处理C/C++并添加其他模块 -根本不使用sys
-使用argv项作为函数的值和其他文件的名称,而不是2小时后的函数名称,我找到了答案。我认为以一种非常简单的方式在这里发布它是值得的

基本上Python中没有函数数据类型,但是有人提到了一个内置的函数eval。我自己的例子需要No-c

解决办法是改变

a = sys.argv[1]

这将对传入的字反转进行评估。它将计算为一个函数。然后ab调用将是对字符串函数的完美调用,就像它的定义一样。输出如下所示:

cpu_location$ python blah.py reversal unquoted
detouqnu

cpu_location$ python blah.py reversal 'withquotes'
setouqhtiw

2小时后,我找到了答案。我认为以一种非常简单的方式在这里发布它是值得的

基本上Python中没有函数数据类型,但是有人提到了一个内置的函数eval。我自己的例子需要No-c

解决办法是改变

a = sys.argv[1]

这将对传入的字反转进行评估。它将计算为一个函数。然后ab调用将是对字符串函数的完美调用,就像它的定义一样。输出如下所示:

cpu_location$ python blah.py reversal unquoted
detouqnu

cpu_location$ python blah.py reversal 'withquotes'
setouqhtiw
比eval解决方案更好的是:

a = globals()[sys.argv[1]]
a(b)
返回将全局变量名称映射到这些全局变量的字典。所以globals['reversion']计算为反转函数

它比eval函数更安全。通过您的方法,您可以执行以下操作:

python blah.py 'lambda x: x+"hi"' foobar
这将打印foobarhi,这是意外的,因为这不是函数名

比eval解决方案更好的是:

a = globals()[sys.argv[1]]
a(b)
返回将全局变量名称映射到这些全局变量的字典。所以globals['reversion']计算为反转函数

它比eval函数更安全。通过您的方法,您可以执行以下操作:

python blah.py 'lambda x: x+"hi"' foobar

这将打印foobarhi,这是意外的,因为这不是函数名

使用谷歌模块:fire

pip install fire
下面是一个简单的例子:

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)
然后,可以从命令行运行:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30

使用谷歌模块:fire

pip install fire
下面是一个简单的例子:

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)
然后,可以从命令行运行:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30

最简单的是使用最简单的是使用请不要使用eval,尤其是在没有对输入进行消毒的情况下。它所做的是将参数作为Python代码进行计算,这是非常危险的。阅读更多信息。谢谢。这篇文章我一时想不通。如果我构建更复杂的东西,我会记住这一点。这个项目只适合我练习。在命令行中测试我的简单函数比在脚本中放置所有测试并在运行脚本时得到一个充满文本的屏幕更容易——其中每个函数都有输出。几年后。我还使用这个sys.argv方法来构建自己的文件拆分器。它有位置参数,可以告诉它只将一个文件拆分为每个文件的x行,或者以相同的方式拆分一个目录中的所有文件。这些参数是使用sys.argv从命令行解析的。但是,在命令行中传递的项均未作为函数进行求值。请不要使用eval,尤其是在未清理输入的情况下。它所做的是将参数作为Python代码进行计算,这是非常危险的。阅读更多信息。谢谢。这篇文章我一时想不通。如果我构建更复杂的东西,我会记住这一点。这个项目只适合我练习。在命令行中测试我的简单函数比在脚本中放置所有测试并在运行脚本时得到一个充满文本的屏幕更容易——其中每个函数都有输出。几年后。我还使用这个sys.argv方法来构建自己的文件拆分器。它有位置参数,可以告诉它只将一个文件拆分为每个文件的x行,或者以相同的方式拆分一个目录中的所有文件。这些参数是使用sys.argv从命令行解析的。但是,在命令行中传递的项都没有作为函数进行计算。我不明白。你的例子怎么了?在我的例子中,第一个参数将始终是我在脚本本身中定义的函数。这就是我希望它成为函数名的原因。@VISQL:这只是一个避免eval和exec的一般准则。它允许人们让脚本做任何他们想做的事情。用这个
方法是将行为严格限制为您想要的,即从函数名获取函数。我不明白。你的例子怎么了?在我的例子中,第一个参数将始终是我在脚本本身中定义的函数。这就是我希望它成为函数名的原因。@VISQL:这只是一个避免eval和exec的一般准则。它允许人们让脚本做任何他们想做的事情。使用这种方法,您可以将行为严格限制在您想要的范围内,即从函数名获取函数。在这种情况下,只能调用计算器。当我写这篇文章时,我打算在一个文件中包含多个不同名称的函数,而不是ant类,我想从命令行调用这个文件。argv+eval可用于此目的。作为第一个参数传递的任何名称都将被视为函数名,随后的参数将被视为该函数的参数。此外,我倾向于选择通过内置的小示例,而不是不是不是默认的模块。功能很好。在这种情况下,只能调用计算器。当我写这篇文章时,我打算在一个文件中包含多个不同名称的函数,而不是ant类,我想从命令行调用这个文件。argv+eval可用于此目的。作为第一个参数传递的任何名称都将被视为函数名,随后的参数将被视为该函数的参数。此外,我倾向于选择通过内置完成的小示例,而不是非默认的模块。