पायथन सलाह: आत्मनिरीक्षण समारोह कॉल की पोर्टेबिलिटी


14

पायथन में, आप dirकिसी भी ऑब्जेक्ट पर फ़ंक्शन का उपयोग उसके उदाहरण कार्यों के नामों की सूची प्राप्त करने के लिए कर सकते हैं :

>>> dir('abc')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__','__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

मैं सोच रहा था कि यह एक कार्यक्रम में एक उपयोगी गोल्फ तकनीक हो सकती है, जिसमें कई लम्बे नाम वाले कार्यों को कॉल किया जा सकता है। ऐसे मामले में, मैं एक फ़ंक्शन चयन फ़ंक्शन बना सकता हूं F:

F=lambda o,i:eval('o.'+dir(o)[i])

अब मान लें कि मेरे पास एक स्ट्रिंग है sऔर मैं इसके पहले अक्षर को कैपिटल में कैपिटलाइज़ करने के परिणाम को स्टोर करना चाहता हूं c। इसके बजाय c=s.capitalize(),मैं ध्यान दें कि capitalizeउपरोक्त सूची में स्थान 33 पर है और निम्नलिखित कर सकते हैं:

s='abc'
c=G(s,33)()

जो असाइन करता 'Abc'है c

मेरा सवाल है कि क्या यह ज्यादातर समय काम करने की संभावना है। विशेष रूप से,

  • क्या मैं हमेशा सूची पर भरोसा कर सकता हूं कि एएससीआईआई मूल्यों द्वारा क्रमबद्ध रूप से छांटा गया है?
  • क्या छोटे संस्करणों के बीच उपलब्ध सूची में कई बदलाव हैं?
  • क्या कार्यान्वयन के बीच अंतर मौजूद हैं?

इसके अलावा, क्या पीपीसीजी पर इससे पहले किसी ने इसका इस्तेमाल किया है?


मैंने जावास्क्रिप्ट और C # के साथ इसी तरह की चीजें देखी हैं।
पीटर टेलर

2
आप इसे बिलिंस के साथ भी कर सकते हैं dir(__builtins__):। और यहाँ एक वैकल्पिक कार्य है F=lambda o,i:getattr(o,dir(o)[i]):।
grc

यह भी ध्यान दें कि आप किन कार्यों का उपयोग करने की योजना पर निर्भर करते हैं, आप ()इस Fतरह के अंत में जोड़ सकते हैं : F=lambda o,i:eval('o.'+dir(o)[i])()फिर c=F('abc',33)'एबीसी' को असाइन करेगा c
फ्राईअमईएग्गमैन

जवाबों:


6

से प्रलेखन :

परिणामी सूची को वर्णानुक्रम में क्रमबद्ध किया गया है

अंतर के रूप में, मुझे लगता है कि आपको जांचना होगा (और आपके जवाब में निर्दिष्ट करना शायद एक अच्छा विचार है)। अजगर 2 और 3 के बीच स्पष्ट अंतर हैं, उदाहरण के लिए, __nonzero__इसका नाम बदल दिया गया था __bool__

मैंने कार्यान्वयन के बीच किसी भी अंतर के बारे में कभी नहीं सुना है, लेकिन मुझे इस पर कोई संदर्भ नहीं मिल रहा है।

मुझे नहीं लगता कि इसका उपयोग पहले कभी किया गया है क्योंकि यह शायद ही कभी ऐसा करने से आपको कोई भी चरित्र बचाएगा:

F=str.capitalize
s='abc'
c=F(s)

dir()इसके लायक होने के लिए आपको कई अलग-अलग कार्यों का उपयोग करने की आवश्यकता होगी ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.