2009-05-11 9 views
101

मैं पाइथन फ़ंक्शन के तर्कों की संख्या कैसे प्राप्त कर सकता हूं? मुझे यह जानने की ज़रूरत है कि इसमें कितने सामान्य तर्क हैं और कितने नाम तर्क हैं।मैं पाइथन फ़ंक्शन के तर्कों की संख्या कैसे प्राप्त कर सकता हूं?

उदाहरण:

def someMethod(self, arg1, kwarg1=None): 
    pass 

इस विधि 2 तर्कों और 1 नामित तर्क है।

+2

मैं एक अधिसूचना प्रणाली लागू कर रहा हूं, जो वास्तव में पहले से नहीं जानता कि रिसीवर कितने तर्क चाहता है। (आम तौर पर यह सब या कोई नहीं है।) –

+39

सवाल पूरी तरह से जरूरी है; अगर यह नहीं था (चूंकि आप हमेशा स्रोत पढ़ सकते हैं), 'निरीक्षण' मानक पुस्तकालय मॉड्यूल के लिए कोई औचित्य नहीं होगा। – flow

+0

भाषाओं की बहुत कम से कम एक अन्यायपूर्ण सुविधा लागू करती है। 'निरीक्षण' मॉड्यूल में कई अन्य विशेषताएं हैं, इसलिए यह कहना गलत है कि यदि कोई विशेष कार्य इसमें होता है तो संपूर्ण मॉड्यूल अन्यायपूर्ण होगा। इसके अलावा, यह देखना आसान है कि इस सुविधा को खराब तरीके से कैसे इस्तेमाल किया जा सकता है। (Http://stackoverflow.com/questions/741950 देखें)। उस ने कहा, यह एक उपयोगी विशेषता है, खासकर सजावटी और अन्य कार्यों को लिखने के लिए जो काम पर काम करते हैं। – user1612868

उत्तर

43

पहले से स्वीकार किए जाते हैं जवाब Python 3.0 के रूप में deprecated किया गया है। inspect.getargspec का उपयोग करने के बजाय अब आपको Signature कक्षा का चयन करना चाहिए जो इसे हटा देता है। , अब

from inspect import signature 

def someMethod(self, arg1, kwarg1=None): 
    pass 

sig = signature(someMethod) 

आप या तो इसे ing str द्वारा जल्दी से अपने मानकों को देख सकते हैं:

समारोह के लिए एक हस्ताक्षर बनाना signature function आसान है

str(sig) # returns: '(self, arg1, kwarg1=None)' 

या आप भी एक प्राप्त कर सकते हैं sig.parameters के माध्यम से पैरामीटर ऑब्जेक्ट्स में विशेषता नामों का मानचित्रण।

params = sig.parameters 
print(params['kwarg1']) # prints: kwarg1=20 

साथ ही, आपको sig.parameters पर len फोन भी तर्क की संख्या को देखने के लिए इस समारोह की आवश्यकता कर सकते हैं:

print(len(params)) # 3 

params मानचित्रण में प्रत्येक प्रविष्टि वास्तव में एक Parameter object अपने जीवन बनाने आगे गुण है कि आसान।

kwarg1 = params['kwarg1'] 
kwarg1.default # returns: None 

इसी तरह parameters में निहित वस्तुओं के बाकी के लिए: उदाहरण के लिए, एक पैरामीटर हथियाने और उसके डिफ़ॉल्ट मान को देखने अब आसानी के साथ किया जाता है।


अजगर 2.x उपयोगकर्ताओं के लिए के रूप में, जबकि inspect.getargspecपदावनत नहीं है, भाषा जल्दी ही हो जाएगा :-)। Signature कक्षा 2.x श्रृंखला में उपलब्ध नहीं है और यह नहीं होगी। तो आपको अभी भी inspect.getargspec के साथ काम करने की आवश्यकता है।

अजगर 2 और 3 के बीच संक्रमण, यदि आप कोड है कि अजगर 2 में getargspec के इंटरफेस पर निर्भर करता है है और 3 में signature का उपयोग करने जा के रूप में भी मुश्किल है, आप inspect.getfullargspec का उपयोग करने का मूल्यवान विकल्प की क्या ज़रूरत है। यह आदेश है, जबकि भी कुछ अतिरिक्त मामलों है कि getargspec नहीं है से निपटने के एक समारोह के तर्कों को आकर्षित करने में getargspec (एक प्रतिदेय तर्क) के लिए एक समान इंटरफेस प्रदान करता है:

from inspect import getfullargspec 

def someMethod(self, arg1, kwarg1=None): 
    pass 

args = getfullargspec(someMethod) 

getargspec साथ के रूप में, getfullargspec एक NamedTuple रिटर्न जो तर्क शामिल हैं।

print(args) 
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={}) 
+1

ऐसे पुराने प्रश्न के लिए एक नया उत्तर लिखने के लिए धन्यवाद, यह कमाल है! –

+0

आपका स्वागत है @ GeorgSchölly। मैं एक लोकप्रिय सवाल से आश्चर्यचकित था जैसे इस प्रस्ताव की पेशकश की गई थी कि या तो सही स्नीकी ('co_argcount' विशेषता में देखकर) को हटा दिया गया था या नीचे गिरा दिया गया था। –

+0

' getfullargspec' पायथन 2.x में लागू नहीं किया गया है, आपको 'getargspec' –

114
import inspect 
inspect.getargspec(someMethod) 

the inspect module

+4

आम तौर पर आप जो चाहते हैं, लेकिन यह अंतर्निहित कार्यों के लिए काम नहीं करता है। बिल्टिन के लिए यह जानकारी प्राप्त करने का एकमात्र तरीका उनके __doc__ स्ट्रिंग को पार्स करना है, जो कि बदसूरत लेकिन काम करने योग्य है। – Cerin

+3

इसे पायथन 3 में बहिष्कृत किया गया है: https://docs.python.org/3/library/inspect.html#inspect.getargspec – noisecapella

+0

क्या कोई ऐसा समाधान है जिसे पायथन 3 में बहिष्कृत नहीं किया गया है? – hlin117

16

देख inspect.getargspec()

Get the names and default values of a function’s arguments. A tuple of four things is returned: (args, varargs, varkw, defaults). args is a list of the argument names (it may contain nested lists). varargs and varkw are the names of the * and ** arguments or None. defaults is a tuple of default argument values or None if there are no default arguments; if this tuple has n elements, they correspond to the last n elements listed in args.

Changed in version 2.6: Returns a named tuple ArgSpec(args, varargs, keywords, defaults).

can-you-list-the-keyword-arguments-a-python-function-receives देखें।

25
someMethod.func_code.co_argcount 

या, यदि वर्तमान समारोह नाम अनिर्धारित है:

import sys 

sys._getframe().func_code.co_argcount 
+0

+1, आप इसे कहां से प्राप्त करते हैं? – elyase

+4

@elyase, बस करें: 'dir (someMethod) '->' func_code''; आगे जाएं: 'डीआईआर (someMethod.func_code) '->'' co_argcount''; आप ऑब्जेक्ट के उपलब्ध विधियों को निर्धारित करने के लिए अंतर्निहित 'dir()' का उपयोग कर सकते हैं। –

+0

@elyase मैं भी उत्सुक था, इसलिए मुझे यह https://docs.python.org/2/library/inspect.html#types-and-members – rodripf

3

ऊपर करने के लिए जोड़ा जा रहा है, मैं यह भी कहा कि कई बार मदद के सबसे() फ़ंक्शन वास्तव में मदद करता है

देखा है उदाहरण के लिए, यह तर्कों के बारे में सभी विवरण देता है।

help(<method>) 

देता है नीचे

method(self, **kwargs) method of apiclient.discovery.Resource instance 
Retrieves a report which is a collection of properties/statistics for a specific customer. 

Args: 
    date: string, Represents the date in yyyy-mm-dd format for which the data is to be fetched. (required) 
    pageToken: string, Token to specify next page. 
    parameters: string, Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2. 

Returns: 
    An object of the form: 

    { # JSON template for a collection of usage reports. 
    "nextPageToken": "A String", # Token for retrieving the next page 
    "kind": "admin#reports#usageReports", # Th 
+0

लोगों के लिए यह टिप्पणी करना अच्छा होगा कि पोस्ट के साथ गलत क्या है, बस शून्य बटन पर क्लिक करें। –

+2

'हेल्प' फ़ंक्शन केवल दिखाता है कि डॉकस्ट्रिंग क्या कहता है। क्या आपने यह भी परीक्षण किया है कि क्या यह प्रश्न में फ़ंक्शन परिभाषा के साथ काम करता है? – 0xc0de

+0

@ 0xc0de - क्या आपने इसका परीक्षण किया है? क्योंकि यह वास्तव में काम करता है। 'मदद()' केवल डॉकस्ट्रिंग से अधिक थूकता है - यहां तक ​​कि अनियंत्रित कोड पर भी यह अभी भी argspec को प्रिंट करता है और आपको बताता है कि कोड कहां परिभाषित किया गया था। मूल प्रश्न पोस्ट करने वाले व्यक्ति को यह स्पष्ट नहीं था कि उन्हें एक ऐसे उत्तर की आवश्यकता है जो मशीन या मानव अनुकूल था। अगर इसे केवल मानव अनुकूल होना चाहिए, तो 'सहायता()' पूरी तरह से पर्याप्त है। – ArtOfWarfare

1

अन्य उत्तर का सुझाव के रूप में, getargspec साथ ही काम करता है बात जब तक पूछे जा रहा है वास्तव में एक समारोह है। यह लिए काम नहीं करता में निर्मित इस तरह के open, len, आदि के रूप में काम करता है, और में एक अपवाद फेंक देते हैं इस तरह के मामलों:

TypeError: <built-in function open> is not a Python function 

नीचे समारोह (this answer से प्रेरित) एक समाधान को दर्शाता है। यह f से उम्मीद आर्ग की संख्या देता है:

from inspect import isfunction, getargspec 
def num_args(f): 
    if isfunction(f): 
    return len(getargspec(f).args) 
    else: 
    spec = f.__doc__.split('\n')[0] 
    args = spec[spec.find('(')+1:spec.find(')')] 
    return args.count(',')+1 if args else 0 

विचार __doc__ स्ट्रिंग से बाहर समारोह कल्पना पार्स करने के लिए है। जाहिर है यह कहा स्ट्रिंग के प्रारूप पर निर्भर करता है तो शायद ही मजबूत है!

संबंधित मुद्दे

 संबंधित मुद्दे