Bí quyết là sử dụng Globals []:
globals[]['use_variable_as_function_name'][]
sẽ tương đương với
use_variable_as_function_name[]
Tìm thấy tại: George Sakkis //bytes.com/topic/python/answers/792283-calling-varable-function-name-name
Sau đây là một ứng dụng hữu ích của câu hỏi trên tôi cần ngay bây giờ [đó là lý do tại sao tôi đến đây]: Áp dụng các chức năng đặc biệt cho các URL tùy thuộc vào bản chất của chúng:
l = ['condition1', 'condition2', 'condition3']
tôi từng viết
if 'condition1.' in href:
return do_something_condition1[]
if 'condition2.' in href:
return do_something_condition2[]
if 'condition3.' in href:
return do_something_condition3[]
Và như vậy - Danh sách của tôi có 19 thành viên bây giờ và tiếp tục phát triển.
Trong khi điều tra chủ đề và phát triển, mã chức năng đã hoàn toàn là một phần tự nhiên của chức năng chính khiến nó sớm trở nên kinh khủng khi đọc, vì vậy việc chuyển mã làm việc thành các chức năng là một sự cứu trợ tuyệt vời.
Mã vụng về này có thể được thay thế bằng:
for e in l: # this is my condition list
if e + '.' in href: # this is the mechanism to choose the right function
return globals[]['do_something_' + e][]
Bằng cách này, mã chính vẫn đơn giản và dễ đọc cho dù danh sách các điều kiện có thể phát triển trong bao lâu.
Tất nhiên, các chức năng tương ứng với các nhãn điều kiện phải được khai báo theo quy ước, tùy thuộc vào bản chất của loại URL trong câu hỏi:
def do_something_condition1[href]:
# special code 1
print['========1=======' + href]
def do_something_condition2[href]:
# special code 2
print['========2=======' + href]
def do_something_condition3[href]:
# special code 3
print['========3=======' + href]
Test:
>>> href = '//google.com'
>>> for e in l:
... globals[]['do_something_' + e][href]
...
========1=======//google.com
========2=======//google.com
========3=======//google.com
Hoặc, để mô hình hóa nó gần hơn với kịch bản trên:
success = '________processed successfully___________ '
def do_something_google[href]:
# special code 1
print['========we do google-specific stuff=======']
return success + href
def do_something_bing[href]:
# special code 2
print['========we do bing-specific stuff=======']
return success + href
def do_something_wikipedia[href]:
# special code 3
print['========we do wikipedia-specific stuff=======']
return success + href
Test:
l = ['google', 'bing', 'wikipedia']
href = '//google.com'
def test[href]:
for e in l:
if e + '.' in href:
return globals[]['do_something_' + e][href]
>>> test[href]
========we do google-specific stuff=======
'________processed successfully___________ //google.com'
Result:
Việc xây dựng thêm về vấn đề bây giờ chỉ là số lượng để tăng cường danh sách điều kiện từng cái một và viết các chức năng tương ứng tùy thuộc vào đối số. Cơ chế trên sẽ chọn đúng sau đó.
Trong Python, các hàm là các đối tượng "hạng nhất '': chúng có thể có các tên biến được gán cho chúng, chúng có thể được truyền dưới dạng đối số cho các chức năng khác và thậm chí có thể được trả lại từ các chức năng khác. , nhưng tên đó có thể được chỉ định lại để giới thiệu một đối tượng khác nếu muốn [đừng làm điều này trừ khi bạn muốn nói!]
Như ví dụ sau đây chứng minh, có thể nhiều hơn một tên biến được gán cho cùng một đối tượng hàm.
>>> def cosec[x]:
... """Return the cosecant of x, cosec[x] = 1/sin[x]."""
... return 1./math.sin[x]
...
>>> cosec
>>> cosec[math.pi/4]
1.4142135623730951
>>> csc = cosec
>>> csc
>>> csc[math.pi/4]
1.4142135623730951
Bài tập
use_variable_as_function_name[]
0 liên kết trình định danh [tên biến] use_variable_as_function_name[]
1 với cùng một đối tượng hàm với định danh use_variable_as_function_name[]
2: Hàm này sau đó có thể được gọi với use_variable_as_function_name[]
3 cũng như với use_variable_as_function_name[]
4.