Python如何获取到当前函数名和通过字符串调用函数

获取当前函数名:

应用环境: 某些时候, 为了简化和更好扩展程序,我们需要获取到当前运行的函数名字

方法1(不推荐)

import sys
def I_want_to_know_my_name():
    print(sys._getframe().f_code.co_name) #你懂得,下划线开头的不应该使用的

方法2

import traceback
def who_am_i():
    return traceback.extract_stack()[-2][2]

def I_want_to_know_my_name():
    print(who_am_i())

方法3

import inspect
def who_am_i2():
    return inspect.stack()[1][3]

def I_want_to_know_my_name():
    print(who_am_i2())

通过字符串调用函数

通过反射或者exec来调用, 下面有类和函数的例子
类:

class foo(object):
    def load(self):
        f = getattr(self, "load_json")
        f()

    def load_json(self):
        print("This is load_json module")

myfunc = foo()
myfunc.load()

函数(反射):

# 单模块情况下, 多模块就import module1,  然后getattr(module1....)
import sys
def bar():
    print("This is bar")

def foo():
    print("This is foo")

def check_str(stra):
    mod = sys.modules[__name__] #获取当前模块对象
    if hasattr(mod, stra):
        getattr(mod, stra)()
    else:
        print("No this module")

check_str("bar") #你可能会问如果输入check_str会怎么样, 我会告诉你缺少变量并报错,不过最好还是在上面函数加判断避免这种情况出现

函数(exec):

def bar():
    print("This is bar")

def foo(stra):
    try:
        exec(stra)
    except:
        print("No this module")

foo("bar()")

结合一起用的例子

假设对外提供一个load的函数, 通过一系列的判断, 我获取到一个ext_module_name的值, 通过这个值和"load", 我各种low 错了,是load. 如果以后需要扩展xml, gson, yaml等等, 只有写上对应的###_load就可以了

import traceback
ext_module_name = "_pickle_" #假设这个变量是之前一系列过程得到的结果

def who_am_i():
    return traceback.extract_stack()[-2][2]

def _json_load():
    print("json load")

def _pickle_load():
    print("pickle load")

def load():
    my_name = who_am_i()
    try:
        return exec("%s%s()" % (ext_module_name, my_name))
    except Exception as e:
        raise e

load()

原文地址:http://blog.51cto.com/11257471/2062914

时间: 2024-10-29 20:01:28

Python如何获取到当前函数名和通过字符串调用函数的相关文章

【C语言】编写一个函数reverse_string(char * string)(递归实现),将参数字符串中的字符反向排列,不能使用C函数库中的字符串操作函数。

//编写一个函数reverse_string(char * string)(递归实现) //实现:将参数字符串中的字符反向排列. //要求:不能使用C函数库中的字符串操作函数. #include <stdio.h> #include <assert.h> void reverse_string(char const * string) { assert( string != NULL ); if( *string != '\0' ) { string++; reverse_stri

python 用字符串调用函数名

方法暂时看到两种: ①eval: def a():     print '1' func_a = 'a' eval(func_a)() 结果:1 ②.vars: 获取当前环境中的全部变量. def a():     print '1' func_a = 'a' vars()[func_a]() 结果:1 对于多个函数统一管理的时候,上面两种写法比较方便,可以直接通过管理函数名变量,来直接控制函数的调用. 比如: def a():     print '1'      def b():     p

python类与对象-如何通过实例方法名字的字符串调用方法

如何通过实例方法名字的字符串调用方法 问题举例 在某项目中我们的代码用了三个不同库中的图形类:Circle,Triangle,Rectangle 它们都有一个获取图形面积的接口,单接口名字可能不同,我们可以实现一个统一的获取 面积的函数,使用每种方法名进行尝试,调用相应类的接口. 解决思路 方法一:使用内置函数getattr, 通过名字获取方法对象然后调用 方法二:使用标准库operator下的methodcaller函数调用 代码 from lib1 import Circle from li

聚合函数,数学、字符串、函数,时间日期函数

create database lianxi0425--创建一个名字为lianxi0425的数据库 go use lianxi0425 --使用练习0425这个数据库 go --创建一个学生xinxi1的表,填写学号.名字.出生年份.性别.分数.班级 create table xinxi1 ( code int not null, name varchar(50) not null, birth varchar(50) not null, sex char(10) not null, score

走进C标准库(8)——"string.h"中函数的实现相关字符串操作函数

我的strcat: 1 char *strcat(char *dest,char *src) 2 { 3 char * reval = dest; 4 while(*dest) 5 dest++; 6 while(*src) 7 *dest++ = *src++ ; 8 *dest = *src; 9 return reval; 10 } MSVC: 1 char * __cdecl strcat ( 2 char * dst, 3 const char * src 4 ) 5 { 6 char

Error:指向绑定函数的指针只能用于调用函数

a1.determinant; 改为: a1.determinant(); Eigen::MatrixXd a1(2,2);//ImagePoint a1<<n1,p1,n2,p2; double A1=a1.determinant; 改为: Eigen::MatrixXd a1(2,2);//ImagePoint a1<<n1,p1,n2,p2; double A1=a1.determinant(); 原文地址:https://www.cnblogs.com/wxl8452358

二十、函数指针高级(动态调用)

1.动态调用是系统普遍支持的技术 2.要实现动态调用需要一个对应表 3.示例:使用函数名的字符表调用函数 函数名  函数指针 “max”   maxValue “min”    minValue “avg”    avgValue 4.动态调用 PFUN getFunctionFromName(char *name); int getValue(int a , int b , char *name); 5.示例: typedef int(*PFUN)(int , int); //相当于把int

python入门(13)获取函数帮助和调用函数

Python内置了很多有用的函数,我们可以直接调用. 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数.可以直接从Python的官方网站查看文档: http://docs.python.org/2/library/functions.html#abs 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息. 调用abs函数: >>> abs(100) 100 >>> abs(-20) 20 >>> abs(1

python之路---11 第一类对象 函数名 闭包 迭代器

二十九. 1.函数名的运用    ①函数名是?个变量, 但它是?个特殊的变量, 与括号配合可以执?函数的变量 ②函数名是一个内存地址    ③ 函数名可以赋值给其他变量         ④函数名可以当做容器类的元素     ⑤函数名可以当做函数的参数     ⑥函数名可以作为函数的返回值 2.闭包 闭包就是内层函数, 对外层函数(非全局)的变量的引?. 标准的闭包   ①优点:1).可以保护变量不受侵害 2),保持一个变量常驻内存 ②    .__closure__    查看是否是闭包 返回