2015-02-21 10 views
6

Có thư viện hay ma thuật python cho phép tôi thực hiện tất cả các chức năng trong một tệp mà không gọi chúng một cách rõ ràng. Một cái gì đó rất giống với những gì pytest đang làm - chạy tất cả các chức năng bắt đầu với 'test _...' mà không bao giờ đăng ký chúng ở bất cứ đâu.Có cách nào trong python để thực hiện tất cả các chức năng trong một tập tin mà không gọi chúng một cách rõ ràng?

Ví dụ giả sử tôi có một a.py file:

def f1(): 
    print "f1" 

def f2(): 
    print "f2" 

và giả sử tôi có tập tin - tập tin chính của tôi - main.py:

if __name__ == '__main__': 
    some_magic() 

nên khi tôi gọi:

python main.py 

Kết quả sẽ là:

f1 
f2 
+0

Có vẻ như bạn có thể quan tâm đến [metaprogramming] (http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Metaprogramming.html). Tôi chưa bao giờ đi sâu vào nó vì vậy tôi sẽ là người cuối cùng cho bạn biết cách tiếp cận nó. – Makoto

+0

Bạn có thể sử dụng nội tâm để tìm tất cả các chức năng trong các từ điển địa lý và toàn cầu, có thể bằng cách quay trở lại qua ngăn xếp cuộc gọi để tìm hình cầu/người dân địa phương của người gọi. Nhìn vào mô-đun 'kiểm tra' trong thư viện chuẩn. – cdarke

Trả lời

10

Đây là một cách:

def some_magic(): 
    import a 
    for i in dir(a): 
     item = getattr(a,i) 
     if callable(item): 
      item() 

if __name__ == '__main__': 
    some_magic() 

dir(a) lấy tất cả các thuộc tính của mô-đun a. Nếu thuộc tính là một đối tượng có thể gọi, hãy gọi nó. Điều này sẽ gọi mọi thứ có thể gọi được, vì vậy bạn có thể muốn đủ điều kiện với and i.startswith('f').

0

Dưới đây là một cách khác:

#!/usr/local/bin/python3 
import inspect 
import sys 


def f1(): 
    print("f1") 


def f2(): 
    print("f2") 


def some_magic(mod): 
    all_functions = inspect.getmembers(mod, inspect.isfunction) 
    for key, value in all_functions: 
     if str(inspect.signature(value)) == "()": 
      value() 

if __name__ == '__main__': 
    some_magic(sys.modules[__name__]) 

Nó sẽ chỉ gọi chức năng mà không có bất kỳ thông số bằng cách sử dụng inspect.signature (chức năng).

Các vấn đề liên quan