You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Avoid calling __init__ for classmethod/staticmethod #450
Suppose we want a CLI that is similar to git in the sense that we must first call init before interacting with the repo. For this, we aim for the following (simplified/partially implemented) class, which is intentionally similar to GitPythons Repo class (see here):
When we run the command python something_like_git.py init, it first tries to instantiate the class via __init__, which fails (FileNotFoundError) since it must first create the directory via init.
I think it makes generally more sense if Fire would call classmethods/staticmethods directly on the class without trying to instantiate it. This is usually also how class/static methods are used in a programmatic way (e.g. for git.Repo).
Note that the fix for #113 does not resolve this issue. This is because the path argument for __init__ is (intentionally) optional, so Fire thinks it can call __init__ first. If path wasn't optional, it would behave as wanted: init would be called without first calling __init__.
Hi, I was able to reproduce the behavior described in this issue.
Reproduction
Using the example code
Running:
python fire_repo_init_bug.py init
produces:
FileNotFoundError
This happens because Fire attempts to instantiate the class before calling init(). Since __init__(path=None) has an optional argument, Fire assumes it can safely construct the class first.
Workaround
A simple workaround is to expose CLI commands instead of passing the class directly to fire.Fire().
Activity
RAGHAV2405AR commentedon Mar 16, 2026
Hi, I was able to reproduce the behavior described in this issue.
Reproduction
Using the example code
Running:
produces:
This happens because Fire attempts to instantiate the class before calling
init(). Since__init__(path=None)has an optional argument, Fire assumes it can safely construct the class first.Workaround
A simple workaround is to expose CLI commands instead of passing the class directly to
fire.Fire().Example:
With this approach, running:
correctly produces:
This prevents Fire from calling
__init__beforeinit().Let me know if you'd like me to open a PR adding this workaround as an example in the documentation.