google / google/python-fire

Usage message is displayed when not desired.

未关闭
#441 1 条评论 4 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
28.2k
派生
1.5k
PR 合并指标
30 天内没有已合并 PR

描述

When I build a class with methods that can be chained (they return `self`), I find that the "commands" help message is written out even when I provide commands with proper arguments and the commands are executed. Here is the code
```
from __future__ import annotations
from fire import Fire

class Foo:
def act(self, x: int) -> Foo:
"""
Act for some number of minutes.
Parameters
----------
x : int
The number of minutes to act.
"""

print("act", x, "minute(s)")
return self

def rest(self, x: int, y: str = "hours") -> Foo:
"""
Rest for a while.
Parameters
----------
x : int
The time to rest.
y : str
The units of x. The default is hours.
"""

print("rest", x, y)
return self

if __name__ == "__main__":
Fire(Foo)
```

If I run this as `python fire_bug.py`, I get the help output I expect, which is
```
NAME
fire_bug.py act 1

SYNOPSIS
fire_bug.py act 1 COMMAND

COMMANDS
COMMAND is one of the following:

act
Act for some number of minutes.

rest
Rest for a while.
```
If I run this as `python fire_bug.py act 1`, I unexpectedly get the help output
```
NAME
fire_bug.py act 1

SYNOPSIS
fire_bug.py act 1 COMMAND

COMMANDS
COMMAND is one of the following:

act
Act for some number of minutes.

rest
Rest for a while.
```
followed by the output I expect, which is
```
act 1 minute(s)
```

If run this as `python fire_bug.py act 1 rest 9`, I again unexpectedly get the help output
```
NAME
fire_bug.py act 1 rest 9

SYNOPSIS
fire_bug.py act 1 rest 9 - COMMAND

COMMANDS
COMMAND is one of the following:

act
Act for some number of minutes.

rest
Rest for a while.
```
followed by the output I expect, which is
```
act 1 minute(s)
rest 9 hours
```
If I add a `__str__` method to the class that returns `"\b"`, I don't get the unexpected messages, but I also don't get a help message if I run `python fire_bug.py`.

As a general observation, running `python fire_bug.py --help` does not produce useful output. The output is
```
NAME
fire_bug.py

SYNOPSIS
fire_bug.py -
```
The output I would expect would be the output I get when I run `python fire_bug.py`. I am aware that if I have an `__init__` method with arguments that the information about those arguments will be displayed, but separating the two sets of information in this way is quite counterintuitive. Both sets of information should be provided when running with no command and when running with only a `--help` argument.

贡献指南

打开贡献指南

调研方向

Reproduce the behavior with the provided fire_bug.py example, including chained commands and --help. Start by tracing Python Fire's command execution and help rendering paths; done means valid commands no longer print unsolicited help while no-command and --help invocations provide useful command information.

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
cli
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。