python - কিভাবে পাইথন একটি স্ট্রিং হিসাবে একটি ফাংশন নাম পেতে?




ফাংশন পাইথন (6)

sys._getframe () পাইথনের সমস্ত বাস্তবায়নের জন্য উপলব্ধ (গননা দেখুন) নিশ্চিত নয়, আপনি একই জিনিস করার জন্য ট্রেসব্যাক মডিউল ব্যবহার করতে পারেন, যেমন।

import traceback
def who_am_i():
   stack = traceback.extract_stack()
   filename, codeline, funcName, text = stack[-2]

   return funcName

স্ট্যাকের একটি কল [-1] বর্তমান প্রক্রিয়া বিবরণ ফিরে আসবে।

https://code.i-harness.com

পাইথন ইন, ফাংশন কল ছাড়া, আমি একটি স্ট্রিং হিসাবে একটি ফাংশন নাম পেতে পারি?

def my_function():
    pass

print get_function_name_as_string(my_function) # my_function is not in quotes

আউটপুট "my_function" উচিত।

পাইথন এ কি ফাংশন পাওয়া যায়? যদি না হয়, get_function_name_as_string কিভাবে প্রয়োগ get_function_name_as_string কোন ধারনা?


আপনি ব্যবহার করতে পারে

import sys
this_function_name = sys._getframe().f_code.co_name

আপনি শুধু এখানে ফাংশন নাম পেতে চান যে জন্য একটি সহজ কোড। আপনি এই ফাংশন সংজ্ঞায়িত আছে বলুন

def function1():
    print "function1"

def function2():
    print "function2"

def function3():
    print "function3"
print function1.__name__

আউটপুট function1 হবে

এখন বলুন আপনি একটি তালিকা এই ফাংশন আছে

a = [function1 , function2 , funciton3]

ফাংশন নাম পেতে

for i in a:
    print i.__name__

আউটপুট হবে

function1
function2
function3


আমি একটি ফাংশন সজ্জা ব্যবহার করে পছন্দ করি। আমি একটি বর্গ যোগ, যা সময় ফাংশন সময়। GLog একটি স্ট্যান্ডার্ড পাইথন লগার হয় অনুমান করুন:

class EnterExitLog():
    def __init__(self, funcName):
        self.funcName = funcName

    def __enter__(self):
        gLog.debug('Started: %s' % self.funcName)
        self.init_time = datetime.datetime.now()
        return self

    def __exit__(self, type, value, tb):
        gLog.debug('Finished: %s in: %s seconds' % (self.funcName, datetime.datetime.now() - self.init_time))

def func_timer_decorator(func):
    def func_wrapper(*args, **kwargs):
        with EnterExitLog(func.__name__):
            return func(*args, **kwargs)

    return func_wrapper

তাই এখন আপনি আপনার ফাংশন সঙ্গে এটি করতে হবে সব সাজাইয়া এবং voila

@func_timer_decorator
def my_func():

@ ডেমিনের উত্তরের এক্সটেনশন হিসাবে, আমি কিছু ইউটিলিটি ফাংশন তৈরি করেছি যা বর্তমান ফাংশনের নাম এবং বর্তমান ফাংশন এর আর্গুমেন্টগুলি মুদ্রণ করে:

import inspect
import logging
import traceback

def get_function_name():
    return traceback.extract_stack(None, 2)[0][2]

def get_function_parameters_and_values():
    frame = inspect.currentframe().f_back
    args, _, _, values = inspect.getargvalues(frame)
    return ([(i, values[i]) for i in args])

def my_func(a, b, c=None):
    logging.info('Running ' + get_function_name() + '(' + str(get_function_parameters_and_values()) +')')
    pass

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
    '%(asctime)s [%(levelname)s] -> %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

my_func(1, 3) # 2016-03-25 17:16:06,927 [INFO] -> Running my_func([('a', 1), ('b', 3), ('c', None)])

my_function.__name__

__name__ ব্যবহার করা পছন্দসই পদ্ধতি হিসাবে এটি অভিন্নভাবে প্রযোজ্য। func_name থেকে ভিন্ন, এটি অন্তর্নির্মিত ফাংশনগুলিতেও কাজ করে:

>>> import time
>>> time.time.func_name
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'builtin_function_or_method' object has no attribute 'func_name'
>>> time.time.__name__ 
'time'

এছাড়াও ডবল underscores পাঠক নির্দেশ করে এই একটি বিশেষ বৈশিষ্ট্য। একটি বোনাস হিসাবে, ক্লাস এবং মডিউলগুলির একটি __name__ বৈশিষ্ট্য রয়েছে, তাই আপনি শুধুমাত্র একটি বিশেষ নাম মনে __name__





function