2012-07-28 31 views
18

Đối với các thông báo gỡ lỗi dài dòng trong ứng dụng của tôi, tôi đang sử dụng một hàm trả về tiền tố hữu ích. Hãy xem xét ví dụ sau:Python - lấy tên mô-đun trọn gói

import inspect 

def get_verbose_prefix(): 
    """Returns an informative prefix for verbose debug output messages""" 
    s = inspect.stack() 
    module_name = inspect.getmodulename(s[1][1]) 
    func_name = s[1][3] 

    return '%s->%s' % (module_name, func_name) 

def awesome_function_name(): 
    print "%s: Doing some awesome stuff right here" % get_verbose_prefix() 

if __name__ == '__main__': 
    awesome_function_name() 

đầu ra này:

test->awesome_function_name: Doing some awesome stuff right here

Vấn đề của tôi là: Khi tôi có một mô-đun trong một gói, ví dụ 'myproject.utilities.input', tên mô-đun được trả lại từ get_verbose_prefix vẫn chỉ là 'đầu vào', không phải 'myproject.utilities.input'. Điều này làm giảm đáng kể tính hữu ích của tiền tố trong các dự án lớn khi có thể có nhiều mô-đun 'đầu vào' trong các mô-đun con khác nhau cùng làm việc với nhau.

Vì vậy, câu hỏi của tôi là: Có cách nào đơn giản để truy xuất tên mô-đun đầy đủ trong gói của nó bằng Python không? Tôi đang lập kế hoạch mở rộng chức năng get_verbose_prefix để kiểm tra các tệp '__init__.py' trong thư mục mẹ của mô-đun để ngoại suy tên đầy đủ của nó, nhưng trước tiên tôi muốn biết liệu có cách nào dễ dàng hơn để thực hiện điều đó hay không.

Trả lời

27

__name__ luôn chứa tên đầy đủ của mô-đun. (Khác với __main__ trên chính, tất nhiên.)

+1

Tôi cho rằng đó là sự thật, nhưng làm thế nào để tôi nhận được để các module thực tế từ ngữ của hàm tiền tố của tôi? – Hubro

+8

Đừng bận tâm, tôi đã hiểu rằng: 'inspect.getmodule (s [1] [0]) .__ name__'. Ngoài ra bạn nên chỉnh sửa trong đó '__name__' không thực sự luôn luôn trả về tên đầy đủ của mô-đun kể từ khi nó trả về' __main__' trên mô-đun thực hiện – Hubro

+0

's' trong' inspect.getmodule (s [1] [0]) .__ name__'? –

6

Hãy thử sử dụng thuộc tính __name__ của mô-đun.

2

Một cách đơn giản để lấy tên module đầy đủ trong vòng gói của nó:

print(__file__) 
Các vấn đề liên quan