पूर्णता 'के लिए, मैं बाहर बात करने के लिए है कि कभी कभी आप इसे आयात करने के बजाय पार्स कोड कर सकते हैं करना चाहते हैं। एक import
शीर्ष-स्तरीय अभिव्यक्ति निष्पादित करेगा, और यह एक समस्या हो सकती है।
उदाहरण के लिए, मैं उपयोगकर्ताओं को zipapp के साथ किए जा रहे पैकेजों के लिए एंट्री पॉइंट फ़ंक्शंस चुनने दे रहा हूं। import
और inspect
का उपयोग करके भटकने वाले कोड चलने वाले जोखिम, क्रैश की ओर अग्रसर, संदेशों को मुद्रित करने में सहायता करें, जीयूआई संवाद पॉप-अप करें और इसी तरह।
इसके बजाय मैं सभी शीर्ष स्तर के कार्यों को सूचीबद्ध करने के ast मॉड्यूल का उपयोग:
import ast
import sys
def top_level_functions(body):
return (f for f in body if isinstance(f, ast.FunctionDef))
def parse_ast(filename):
with open(filename, "rt") as file:
return ast.parse(file.read(), filename=filename)
if __name__ == "__main__":
for filename in sys.argv[1:]:
print(filename)
tree = parse_ast(filename)
for func in top_level_functions(tree.body):
print(" %s" % func.name)
list.py
में इस कोड को लाना और इनपुट के रूप में उपयोग करते हुए, मैं:
$ python list.py list.py
list.py
top_level_functions
parse_ast
बेशक
, एक एएसटी नेविगेट करना कभी-कभी मुश्किल हो सकता है, यहां तक कि पाइथन जैसी अपेक्षाकृत सरल भाषा के लिए भी, क्योंकि एएसटी काफी कम स्तर है। लेकिन अगर आपके पास एक सरल और स्पष्ट उपयोग केस है, तो यह दोनों काम करने योग्य और सुरक्षित है।
हालांकि, नकारात्मकता यह है कि आप रनटाइम पर जेनरेट किए गए कार्यों का पता नहीं लगा सकते हैं, जैसे foo = lambda x,y: x*y
।
कृपया चयनित उत्तर की समीक्षा करने पर विचार करें! अन्य उत्तरों में सुझाए गए समाधानों का उपयोग करने के लिए बेहतर/आसान हैं। – r2d2oid