如何将列表/数组作为参数传递给 python fire?

Duk*_*e79 6 python python-fire

我有这样的功能 -

def my_func(my_list_arg=["one", "two"]):
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用python-fire.

我尝试了几种方法 -


尝试 1:

fire_runner.py my_func [one, two]
Run Code Online (Sandbox Code Playgroud)

导致两个单独的参数"[one""two]"


尝试 2:

fire_runner.py my_func ["one", "two"]
Run Code Online (Sandbox Code Playgroud)

具有相同的结果。


尝试 3:

fire_runner.py my_func [\"one\", \"two\"]
Run Code Online (Sandbox Code Playgroud)

同样的结果。

Cod*_*ice 13

您的列表将首先由命令行 shell 解析。这意味着您需要将其强制为单个参数。有很多方法可以做到这一点:

  1. 没有空间: [one,two]

  2. 逃离空间: [one,\ two]

  3. 行情:"[one, two]"

请注意,您可以使用以下语法修改函数以获取参数列表:

def my_func(*args):
Run Code Online (Sandbox Code Playgroud)

args这里的名字是约定俗成的,但它只是一个变量名,所以它可以是任何东西。这将允许您将函数调用为

fire_runner.py my_func one two
Run Code Online (Sandbox Code Playgroud)

  • 好点 - 我只是使用“bash”。但是,考虑到您将得到的错误是:“KeyError: '[one,two.two]'”,我们可以推断句号已进入命令 ok。一个笨拙的解决方案是引用键和列表: `fire_runner.py my_func "['one','two.two']"` (2认同)

ror*_*noa 5

添加此答案只是为了特殊情况。

鉴于你的功能是这样的:

def my_func(dates: List[str] = []):
    ...
Run Code Online (Sandbox Code Playgroud)

如果您需要从 CLI 发送日期列表(或数字和字符的任意组合),则以下操作将不起作用

fire_runner.py my_func --dates 2021-09-20,
fire_runner.py my_func --dates "[2021-09-20]"
fire_runner.py my_func --dates [2021-09-20]
Run Code Online (Sandbox Code Playgroud)

在上述所有情况下,日期将被读取为一个字符串而不是字符串列表。为了正确阅读字符串列表,您可以使用以下内容。

fire_runner.py my_func --dates "[\"2021-09-20\"]"
fire_runner.py my_func --dates "[\"2021-09-20\", \"2021-09-76\"]"
Run Code Online (Sandbox Code Playgroud)