Avoid calling __init__ for classmethod/staticmethod
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 45/100
Piste de recherche
Commencez par le point d’entrée de Fire montré dans l’exemple, fire.Fire(SomethingLikeGit), et suivez la manière dont init, __init__, les méthodes de classe et les méthodes statiques sont dispatchées. Reproduisez python something_like_git.py init sans répertoire .something_like_git existant ; le travail est terminé lorsque init peut s’exécuter sans invoquer __init__, tandis que les commandes d’instance ordinaires conservent leur comportement actuel d’initialisation.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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):
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).
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!
- Langage dominant
- Python
- Étoiles
- 28.2k
- Forks
- 1.5k
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de google/python-fire
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
google/python-fire#705 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
google/python-fire#703 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
google/python-fire#693 ·
-
Release 0.7.2?Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 38/100
google/python-fire#698 ·
-
Difficulté 3/5 1-2 jours Accessibilité débutants 58/100
google/python-fire#672 · 5 commentaires ·
Toutes les issues de google/python-fire
Issues similaires
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
raullenchai/Rapid-MLX#4042 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
LearningCircuit/local-deep-research#7067 ·
Les mainteneurs répondent en général sous 1 jour
-
#bug
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
apache/superset#44923 · 1 commentaire ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
lawndoc/stack-back#123 ·