google / google/python-fire

Avoid calling __init__ for classmethod/staticmethod

Abierto
#450 1 comentario 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Python
Estrellas
28.2k
Forks
1.5k
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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 `GitPython`s `Repo` class (see [here](https://gitpython.readthedocs.io/en/stable/tutorial.html)):

```python
from pathlib import Path
import fire

class SomethingLikeGit:

dirname = ".something_like_git"

@classmethod
def init(cls, path=None):
path = Path(path or Path.cwd())
path = path / cls.dirname
print("Initializing at", path)
path.mkdir()
...
print("Done.")

def __init__(self, path=None):
path = Path(path or Path.cwd())
for parent in (path, *path.parents):
self.path = parent / self.dirname
if self.path.exists():
break
else:
raise FileNotFoundError(path)

...

if __name__ == "__main__":
fire.Fire(SomethingLikeGit)
```

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`](https://gitpython.readthedocs.io/en/stable/tutorial.html)).

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__`.

Anyway, thanks for your great work!

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.