Avoid calling __init__ for classmethod/staticmethod

Đang mở
#450 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
45/100
Loại issue
Tính năng
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
python
Lĩnh vực
cli

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.

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 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!

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của google/python-fire

Tất cả issue của google/python-fire

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.