পাইথন ফাংশনের আর্গুমেন্টের সংখ্যাটি কীভাবে খুঁজে পাব?


163

পাইথন ফাংশনের আর্গুমেন্টের সংখ্যাটি কীভাবে খুঁজে পাব? এর কতগুলি সাধারণ যুক্তি রয়েছে এবং কত নাম যুক্তি রয়েছে তা আমার জানা দরকার।

উদাহরণ:

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

এই পদ্ধতিতে 2 টি যুক্তি এবং 1 টি যুক্তিযুক্ত যুক্তি রয়েছে।


43
প্রশ্ন সম্পূর্ণরূপে warranted; যদি এটি না হয় (যেহেতু আপনি সর্বদা উত্সটি পড়তে পারেন), inspectস্ট্যান্ডার্ড লাইব্রেরি মডিউলটির কোনও যৌক্তিকতা থাকবে না ।
প্রবাহিত করুন

প্রচুর ভাষাগুলি কমপক্ষে একটি অযৌক্তিক বৈশিষ্ট্য প্রয়োগ করে। inspectতাই এটা বলতে যে সমগ্র মডিউল যদি তাতে একটি বিশেষ ফাংশন ছিল অহেতুক হবে অন্যায্য মডিউল দেখবেন, অন্যান্য বৈশিষ্ট্য অনেক আছে। তদতিরিক্ত, কীভাবে এই বৈশিষ্ট্যটি খারাপ ব্যবহার করা যায় তা সহজেই দেখা যায়। ( স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 1919১৯৫০ দেখুন )। এটি বলেছিল, এটি একটি দরকারী বৈশিষ্ট্য, বিশেষত সজ্জা এবং ফাংশনটিতে পরিচালিত অন্যান্য ফাংশনগুলি লেখার জন্য।
ব্যবহারকারী 1612868

উত্তর:


130

পূর্বে গৃহীত উত্তর হয়েছে অবচিত হিসাবে Python 3.0। ব্যবহার inspect.getargspecনা করে আপনার এখন Signatureক্লাসটি বেছে নেওয়া উচিত যা এটি ছাড়িয়ে গেছে।

ফাংশন জন্য একটি স্বাক্ষর তৈরি করা হচ্ছে মাধ্যমে সহজ signatureফাংশন :

from inspect import signature

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

sig = signature(someMethod)

এখন, আপনি এটির মাধ্যমে এটির পরামিতিগুলি দ্রুত দেখতে strপারেন:

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

অথবা আপনি প্যারামিটার অবজেক্টগুলির মাধ্যমে বিশিষ্ট নামগুলির ম্যাপিংও পেতে পারেন sig.parameters

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

উপরন্তু, আপনি কল করতে পারেন lenউপর sig.parametersএছাড়াও আর্গুমেন্ট এই ফাংশন প্রয়োজন সংখ্যা দেখতে:

print(len(params))  # 3

paramsম্যাপিংয়ের প্রতিটি প্রবেশই আসলে এমন একটি Parameterঅবজেক্ট যা আপনার জীবনকে আরও সহজ করে তোলে এমন আরও বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, একটি পরামিতি দখল করা এবং এর ডিফল্ট মানটি এখন সহজেই এর সাথে সঞ্চালিত হয়:

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

একইভাবে অন্তর্ভুক্ত বস্তু বাকি জন্য parameters


পাইথন 2.xব্যবহারকারীদের ক্ষেত্রে, অবহেলিত inspect.getargspec না হলেও ভাষা শীঘ্রই :-) হয়ে উঠবে। Signatureক্লাসে উপলব্ধ নয় 2.xসিরিজ এবং হবে না। সুতরাং আপনার এখনও কাজ করা প্রয়োজন inspect.getargspec

পাইথন 2 এবং 3 এর মধ্যে রূপান্তরের জন্য, যদি আপনি কোড আছে ইন্টারফেস উপর নির্ভর getargspecপাইথন 2 এবং সুইচিং signatureমধ্যে 3খুব কঠিন, আপনাকে মূল্যবান বিকল্প আছে ব্যবহারের 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
আপনি @ জর্জিস্কুলি স্বাগত। আমি অবাক হয়েছি এর মতো একটি জনপ্রিয় প্রশ্ন যেমন সমাধানের প্রস্তাব দেয় যা হয় হ্রাস করা হয় বা ডান দিকে co_argcount
লুকিয়ে থাকে

1
getfullargspecপাইথন ২.x এ প্রয়োগ করা হয়নি, আপনাকে ব্যবহার করা দরকারgetargspec
পিটার গিবসন

getargspecউপর বিল্ট-ইন ফাংশান না কাজ করে: getargspec(open)দেয় TypeError: <built-in function open> is not a Python functionদেখুন এই উত্তরটি কিছু ধারনা জন্য ...
starfry

আপনার শেষ উদাহরণে, আপনি যখন print(args)পাবেন তখন defaults=(None,)আপনাকে পাবেন না defaults=None
Seanny123

সেখানে কোনও ফাংশনের আসল প্যারামিটার গণনা পাওয়ার কোনও উপায় যা সাজসজ্জার পরে সাজানো হয়েছে ..?
গুলাটস

117
import inspect
inspect.getargspec(someMethod)

দেখতে মডিউল পরিদর্শন


5
সাধারণত আপনি যা চান তবে এটি অন্তর্নির্মিত কার্যগুলির জন্য কাজ করে না। অন্তর্নির্মিতদের জন্য এই তথ্যটি জানার একমাত্র উপায় হ'ল তাদের ডক স্ট্রিংকে পার্স করা , যা পলকভাবে তবে কার্যকর।
সেরিন


পাইথন 3 এ অবহেলা না করে এমন কোনও সমাধান রয়েছে কি?
hlin117

1
আপনি যদি লিঙ্কটি অনুসরণ করেন তবে দেখতে পাবেন যে এটি ব্যবহারের প্রস্তাব দেয় inspect.signature- ডকস.পিথথন.আর
/

: আমি এখানে docstring পার্স ছাড়া builtin কাজকর্মের জন্য অন্য সম্ভাব্য পদ্ধতির পোস্ট stackoverflow.com/questions/48567935/...
HelloWorld

31
someMethod.func_code.co_argcount

বা, যদি বর্তমান ফাংশনটির নামটি নির্ধারিত হয়:

import sys

sys._getframe().func_code.co_argcount

4
@ ইলিয়াজে, শুধু করুন: dir(someMethod)-> 'func_code'; আরও যান: dir(someMethod.func_code)-> 'co_argcount'; আপনি dir()কোনও অবজেক্টের উপলব্ধ পদ্ধতিগুলি নির্ধারণ করতে অন্তর্নির্মিতটি ব্যবহার করতে পারেন ।

@ ইলিয়াজে আমিও সুশীল ছিলাম, তাই এই ডকস.পাইথন.আর.২
২ /

পাইথন 3:six.get_function_code(someMethod).co_argcount
noisecapella

8
@ নয়েসকেপেল্লার কোনও তৃতীয় পক্ষের মডিউল দরকার নেই, যখন আপনি কেবল পারেনsome_method.__code__.co_argcount
ভালেন্টিন

1
সাধারণভাবে, এই জিনিসগুলি দেখার জন্য আপনাকে ফাংশন অবজেক্টের ভিতরে উঁকি দেওয়া উচিত নয়co_argcountকোড অবজেক্টের মূল্যায়নের সময় অভ্যন্তরীণভাবে ব্যবহৃত হয়। আমি যা বলার চেষ্টা করছি তা হ'ল, কোনও গ্যারান্টি নেই যে এই বৈশিষ্ট্যগুলি এক রিলিজ থেকে অপরটিতে পরিবর্তিত হবে না।
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

16

inspect.getargspec ()

কোনও ফাংশনের যুক্তির নাম এবং ডিফল্ট মান পান। চারটি জিনিসের মূল অংশটি ফিরে আসে: (আরগস, ভারার্গস, বার্ক, ডিফল্ট)। আরগস আর্গুমেন্ট নামের একটি তালিকা (এটি নেস্টেড তালিকা থাকতে পারে)। ভারার্গস এবং ভার্খউ হ'ল * এবং ** আর্গুমেন্টের নাম বা কোনও নয়। ডিফল্ট হ'ল ডিফল্ট আর্গুমেন্ট মানের বা একটি ডিফল্ট আর্গুমেন্ট না থাকলে কিছুই নয়; যদি এই টিপলটিতে n উপাদান থাকে তবে তারা আর্গগুলিতে তালিকাভুক্ত শেষ এন উপাদানগুলির সাথে মিল রাখে।

সংস্করণ ২.6 এ পরিবর্তিত হয়েছে: একটি নামযুক্ত টিপল আরগস্পেক (অর্গস, ভারার্গস, কীওয়ার্ডস, ডিফল্ট) প্রদান করে।

কীওয়ার্ড-আর্গুমেন্ট-অ পাইথন-ফাংশন-প্রাপ্ত-আপনি-তালিকা- দেখতে পারেন


5

উপরের দিকে যুক্ত করে, আমি আরও দেখেছি যে বেশিরভাগ সময় সহায়তা () ফাংশনটি সত্যই সহায়তা করে

উদাহরণস্বরূপ, এটি আর্গুমেন্টগুলি গ্রহণ করে সে সম্পর্কে সমস্ত বিবরণ দেয়।

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

লোকেরা মাইনাস বোতামটি ক্লিক করার চেয়ে কোনও পোস্টে কী ভুল তা নিয়ে মন্তব্য করা ভাল হবে।
ভেনু মুর্তি

2
helpফাংশন কেবলমাত্র ডক্টরসিং যা বলে তা দেখায়। এমনকি যদি আপনি এটি পরীক্ষা করে থাকেন তবে এটি প্রশ্নে ফাংশন সংজ্ঞা নিয়ে কাজ করে?
0xc0de

@ 0xc0de - আপনি এটি পরীক্ষা করেছেন? কারণ এটি আসলে কাজ করে। help()কেবলমাত্র ডক্টরসিংয়ের চেয়েও বেশি কিছু ছুঁড়ে দেয় - এমনকি অননুমোদিত কোডে এটি এখনও আরগস্পেকটি প্রিন্ট করে এবং কোডটি কোথায় সংজ্ঞায়িত হয়েছিল তা আপনাকে বলে। যে ব্যক্তি মূল প্রশ্নটি পোস্ট করেছেন তাদের স্পষ্ট ছিল না যে তাদের এমন কোনও উত্তর দরকার ছিল যা মেশিন বা মানব বান্ধব। যদি এটি কেবল মানববান্ধব হওয়া প্রয়োজন তবে এটি help()পুরোপুরি পর্যাপ্ত।
আর্টঅফ ওয়ারফেয়ার

@ArtOfWarfare না এ সব, যেমন এখন আপনি যাই হোক না কেন বিশ্লেষণ করতে হবে help()আয় ও চেষ্টা করুন এবং এটি argsএবং kwargs
ভালেন্টিন

5

পাইথন 2 এবং পাইথন 3.6+ এর মধ্যে বহনযোগ্য উপায়ে এটি করতে চান এমন লোকদের জন্য সুসংবাদ: ব্যবহার inspect.getfullargspec()পদ্ধতি। এটি পাইথন 2.x এবং 3.6+ উভয় ক্ষেত্রেই কাজ করে

জিম ফাসারাকিস হিলিয়ার্ড এবং অন্যরা যেমন উল্লেখ করেছেন, এটি এর আগে এটি ব্যবহৃত হত:
১. পাইথন ২.x এ: ব্যবহার inspect.getargspec()
২ পাইথন ৩.x: স্বাক্ষর ব্যবহার করুন, যেমন getargspec()এবং অবমুক্ত getfullargspec()করা হয়েছে।

তবে পাইথন ৩.6 (জনপ্রিয় চাহিদা অনুসারে?) শুরু করে বিষয়গুলি আরও ভাল দিকে পরিবর্তিত হয়েছে:

পাইথন 3 ডকুমেন্টেশন পৃষ্ঠা থেকে :

inspect.getfullargspec (func)

সংস্করণ ৩.6 এ পরিবর্তিত হয়েছে : signature()পাইথন ৩.৫- এর পক্ষে অবহেলিত হিসাবে এই পদ্ধতিটি আগে নথিভুক্ত করা হয়েছিল , তবে লিগ্যাসি getargspec()এপিআই থেকে দূরে সরে যাওয়ার একক উত্স পাইথন 2/3 কোডের জন্য একটি স্পষ্টভাবে সমর্থিত স্ট্যান্ডার্ড ইন্টারফেস পুনরুদ্ধার করার জন্য এই সিদ্ধান্তটি বিপরীত হয়েছে ।


3

আপনার প্রয়োজন মেটাতে পরিদর্শন করুন .getargspec ()

from inspect import getargspec

def func(a, b):
    pass
print len(getargspec(func).args)

1
স্ট্যাক ওভারফ্লোতে স্বাগতম! দয়া করে কেবল উত্স কোড দিয়ে উত্তর দিবেন না। আপনার সমাধান কীভাবে কাজ করে সে সম্পর্কে একটি দুর্দান্ত বর্ণনা দেওয়ার চেষ্টা করুন। দেখুন: আমি কীভাবে ভাল উত্তর লিখব? । ধন্যবাদ
সানুন ןɐ কিউপি

2

অন্যান্য উত্তরগুলি getargspecযেমন বোঝায় যে জিনিসটি ততক্ষণ জিজ্ঞাসা করা আসলে ততক্ষণ একটি কাজ। এটা তোলে জন্য কাজ করে না বিল্ট-ইন যেমন ফাংশন open, lenইত্যাদি, এবং এই ক্ষেত্রে একটি ব্যতিক্রম নিক্ষেপ করা হবে:

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

নীচের ফাংশন ( এই উত্তর দ্বারা অনুপ্রাণিত ) একটি workaround প্রদর্শন করে। এটি প্রত্যাশিত আরোগুলির সংখ্যা প্রদান করে 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__স্ট্রিংয়ের বাইরে ফাংশনটি বিশ্লেষণ করতে হবে । অবশ্যই এটি স্ট্রিংয়ের ফর্ম্যাটের উপর নির্ভর করে তাই খুব শক্তিশালী!


2

func.__code__.co_argcountএর আগে আপনাকে যে কোনও আর্গুমেন্টের সংখ্যা দেয় *args

func.__kwdefaults__আপনাকে কীওয়ার্ড আর্গুমেন্টগুলির পরে একটি আদেশ দেয় *args

func.__code__.co_kwonlyargcount সমান len(func.__kwdefaults__)

func.__defaults__আপনাকে আগে উপস্থিত হওয়া optionচ্ছিক আর্গুমেন্টগুলির মান দেয় *args

এখানে সরল দৃষ্টান্ত:

দৃষ্টান্ত

>>> def a(b, c, d, e, f=1, g=3, h=None, *i, j=2, k=3, **L):
    pass

>>> a.__code__.co_argcount
7
>>> a.__defaults__
(1, 3, None)
>>> len(a.__defaults__)
3
>>> 
>>> 
>>> a.__kwdefaults__
{'j': 2, 'k': 3}
>>> len(a.__kwdefaults__)
2
>>> a.__code__.co_kwonlyargcount
2

0

ভিতরে:

import inspect 

class X:
    def xyz(self, a, b, c): 
        return 

print(len(inspect.getfullargspec(X.xyz).args))

বাইরে:

4


দ্রষ্টব্য: যদি xyz দশম শ্রেণীর ভিতরে না থাকে এবং "স্ব" এবং কেবল "ক, খ, সি" না থাকে, তবে এটি 3 মুদ্রিত হত।

3.5 নীচের পাইথন জন্য, আপনি প্রতিস্থাপন করতে চান হতে পারে inspect.getfullargspecদ্বারা inspect.getargspecউপরে কোডে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.