Làm cách nào để lấy đường dẫn tệp cho một lớp bằng Python?


95

Với một lớp C trong Python, làm cách nào để xác định tệp mà lớp đó đã được định nghĩa? Tôi cần thứ gì đó có thể hoạt động từ lớp C hoặc từ một phiên bản ngoài C.

Lý do tôi làm điều này là vì tôi nói chung là một người thích đặt các tệp thuộc cùng một thư mục. Tôi muốn tạo một lớp sử dụng mẫu Django để tự hiển thị dưới dạng HTML. Việc triển khai cơ sở sẽ suy ra tên tệp cho mẫu dựa trên tên tệp mà lớp đó được định nghĩa.

Giả sử tôi đặt một lớp LocationArtifact trong tệp "base / Artifact.py", sau đó tôi muốn hành vi mặc định là tên mẫu là "base / LocationArtifact.html".



2
Những người giả sử bạn biết mô-đun bạn đang tìm kiếm tệp, tôi sẽ chỉ có chuỗi mô-đun khi tôi làm việc với các triển khai ngoài một lớp.
Staale

Câu trả lời:


130

Bạn có thể sử dụng mô-đun kiểm tra , như sau:

import inspect
inspect.getfile(C.__class__)

1
Bạn không chắc chắn những gì tôi đã làm khác nhau nhưng thay vì getfiletôi phải sử dụng: inspect.getmodule(C.__class__)
AJP

4
Lưu ý: không hoạt động trên một lớp được tạo ra bởi người sử dụng
Daniel Braun

6
Điều này có lẽ nên được inspect.getfile(C). Nếu Clà một lớp, thì C.__class__tham chiếu đến object, sẽ tạo ra một ngoại lệ TypeError: <module 'builtins' (built-in)> is a built-in class. Tôi nghĩ rằng chỉ cho một ví dụ cnào đó mà bạn muốn sử dụng inspect.getfile(c.__class__).
cheshirekow,

1
Điều này không xảy ra đối với một lớp mở rộng một lớp cơ sở trừu tượng ( metaclass=abc.ABCMeta), vì nó trả về /usr/local/lib/python3.7/abc.pythay vì tệp thích hợp. Giải pháp của @JarretHardie (bên dưới) đã hoạt động tốt hơn.
martian111

36

thử:

import sys, os
os.path.abspath(sys.modules[LocationArtifact.__module__].__file__)

1
Để lấy đường dẫn từ một thể hiện của C (như mong muốn của OP), hãy thay thế LocationArtifactbằng obj.__class__nơi obj là một thể hiện của LocationArtifact.
martian111

5

Đây là cách tiếp cận sai lầm đối với Django và thực sự ép buộc mọi thứ.

Mẫu ứng dụng Django điển hình là:

  • /dự án
    • /tên ứng dụng
      • models.py
      • views.py
      • / mẫu
        • index.html
        • Vân vân.

1
+1: Làm những gì Django làm một cách tự nhiên và cuộc sống đơn giản hơn rất nhiều.
S.Lott

1
Đã đồng ý. Django là một trong những framework có ít "ma thuật" nhất, nhưng các mẫu, thẻ mẫu và ứng dụng có một số kỳ vọng như một phần của khuôn mẫu của chúng. Nếu bạn đang phải suy luận lớp lập dị, có thể bạn đang đi sai hướng.
Soviut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.