Python 一个奇怪的需求 (通过变量,打印变量名)

宋景霖 · 2021年03月03日 · 最后由 陈恒捷 回复于 2021年03月04日 · 922 次阅读

有没有通过某些方法 使得传入一个变量 返回这个变量的变量名 如图打印后出现'a'而不是 a 的值'1'也不是 para,para 只是一个参数名

---2021.3.4---
其实这个需求 是在我写代码的时候 想有没有办法优化代码想到的,如图

共收到 20 条回复 时间 点赞

你传一个字符串不就行了。。。

仅楼主可见
匿名 #17 · 2021年03月03日

666

def get_para_name(a):
    all_val = list(locals().keys())
    print(all_val[-1])
zailushang 回复

这样只会打印 a 我想打印调用它 传入的变量名

OllieForever 回复

这个我试过了 第一种打印出来是 1=1 第二种打印出来是 para=1 不是我要的 a=1

槽神 回复

放射只能放射 para 吧 外部的 a=‘1’ 放到 def 里面就变成了 para=‘1’ 这个 a 还是没办法通过这个 def 输出

我能想到的就 **,这个还能打出个 a 来:

def get_para_name(**kwargs):
    print(kwargs)


get_para_name(a=1)
独缺 回复

这个确实可以

如果不改变 func 的情况下,感觉只能通过 ast 去解析出抽象语法树,然后才能找到 a

知识盲区了 我去百度百度 ast 是什么玩意

使得传入一个变量 返回这个变量的变量名

这个需求好奇怪。原理上,运行时传入给函数的一般是变量的引用或者变量的值,本身就没有变量名信息。

**kwargs 打印的 “变量名”,实际是传入函数时给的参数名,不是本身变量名。比如

def get_para_name(**kwargs):
    print(kwargs)

b=1
get_para_name(a=b)

打印出来的是 a=1 ,b 这个变量名已经没了。从原理上只能想到用抽象语法树之类的静态工具来做,解析调用函数位置的语法树,找到当时放在参数位置的变量名信息。

能否详细说明下场景是什么?想象不到这个需求的应用场景。也许不一定要用这么复杂的解法?

陈恒捷 回复

帖子更新了 大佬可以看看

典型的 XY 提问法,建议看看提问的智慧手册。
回到你的问题,把参数放一起作为一个 dict,你原来的参数名字对应 dict 的 key。不管调用还是函数中使用都很方便。

宋景霖 回复

我理解你这个需求的关键点是 2 个:

1、如果有传入这个接口参数的变量名 + 值,那就用传入的
2、如果没有,那就用程序里内置的默认值

**kargs 就很满足你需要了。参数名和值都由调用者自定义,只要用的人名字没写错,那就是一一对应的,可以用 for 循环遍历。

不过这个只能解决你最底下函数的问题,倒数第二个函数还是得写很多,所以本质上是这个模式有问题。不知道你具体业务上的场景是怎样,不好给更多建议,可以的话可以从用户需求角度说明下这是个什么功能,要实现什么效果?

陈恒捷 回复


用 **kargs 的话 这样下面要怎么写
场景是这样的:就是单纯想简化代码编写的重复度,因为很明显 上面的第二个图 if 的代码的规则都是有迹可循
我现在是用打印代码的方法 把代码打印出来 然后 copy

rihkddd 回复

好的 确实 思路有点乱 提的问题不准确

是这个意思吗?😂

def fun():
    dict1 = {"a": None}
    return dict1


def update_data_api(**kwargs):
    for key in kwargs.keys():
        if kwargs[key] is None:
            key = fun().get(key)
            print(key)


update_data_api(a=None)
宋景霖 回复

可以参照楼上的解法。kwargs 本身就是个字典了,key 是参数名,value 是参数值。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册