python - 从命令行调用 Python 脚本时有没有办法实现 **kwargs 行为

标签 python

假设我有一个函数如下:

def foo(**kwargs):
    print kwargs

然后像这样调用函数,我得到了所有 kwargs 的这个方便的小字典。

>>> foo(a = 5, b = 7)
{'a': 5, 'b': 7}

我想直接对从命令行调用的脚本执行此操作。所以输入这个:

python script.py a = 5 b = 7

将创建与上面示例类似的字典。这能做到吗?

这是我目前所拥有的:

import sys

kwargs_raw = sys.argv[1:]
kwargs = {key:val for key, val in zip(kwargs_raw[::3], kwargs_raw[1::3])}
print kwargs

这是产生的结果:

Y:\...\Python>python test.py a = 5 b = 7
{'a': '5', 'b': '7'}

所以你可能想知道为什么这还不够好

  1. 它非常结构化,因此,如果 ab 是字符串、整数或 float 之外的任何其他内容,它将无法工作。
  2. 我无法确定用户想要 5 是整数、字符串还是 float

我以前在这里见过 ast.literal_eval(),但我不知道如何让它工作。我的两次尝试都失败了:

>>> ast.literal_eval("a = 5")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "Y:\admin\Anaconda\lib\ast.py", line 49, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')
  File "Y:\admin\Anaconda\lib\ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    a = 5

>>> ast.literal_eval("{a:5,b:7}")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "Y:\admin\Anaconda\lib\ast.py", line 80, in literal_eval
    return _convert(node_or_string)
  File "Y:\admin\Anaconda\lib\ast.py", line 63, in _convert
    in zip(node.keys, node.values))
  File "Y:\admin\Anaconda\lib\ast.py", line 62, in <genexpr>
    return dict((_convert(k), _convert(v)) for k, v
  File "Y:\admin\Anaconda\lib\ast.py", line 79, in _convert
    raise ValueError('malformed string')
ValueError: malformed string

如果重要的话,我在 Windows 7 64 位上使用 Python 2.7.6 32 位。提前致谢

最佳答案

看来您真正正在寻找的是一种解析命令行参数的方法。查看 argparse 模块:http://docs.python.org/2/library/argparse.html#module-argparse

或者,如果你真的想以字典形式给出你的参数,只需使用 json 模块:

import json, sys

# Run your program as:
# python my_prog.py "{'foo': 1, 'bar': 2}"
# (the quotes are important)
data = json.loads(sys.argv[1])

关于python - 从命令行调用 Python 脚本时有没有办法实现 **kwargs 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21237350/

相关文章:

Python 多处理类方法

python - 随机森林的表现比其他方法好得多

python - 什么时候应该将函数的结果存储为 python 中的变量?

python - QTableWidget 中的 PyQt5 QComboBox

python - Django REST框架: apply filter to list view but not detail view

python - 将 None 而不是 Series 传递给函数时出错

python - 创建冒号作为 openCV 和 Python 中形态学操作的内核/结构元素

java - 如何在 Java 或 python 中获得字节顺序?

java - Python 相当于 Java 的 getClass().getFields()

python - 修正粗糙的边缘