Avoid calling __init__ for classmethod/staticmethod
- Ngôn ngữ chính
- Python
- Star
- 28.2k
- Fork
- 1.5k
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
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!
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu với điểm vào Fire được minh họa trong ví dụ, `fire.Fire(SomethingLikeGit)`, và theo dõi cách `init`, `__init__`, các classmethod và staticmethod được dispatch. Tái hiện `python something_like_git.py init` khi chưa có thư mục `.something_like_git`; hoàn thành khi `init` có thể chạy mà không gọi `__init__`, trong khi các lệnh instance thông thường vẫn giữ nguyên hành vi khởi tạo hiện tại.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- cli
- Loại issue
- Tính năng
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100