有没有通过某些方法 使得传入一个变量 返回这个变量的变量名 如图打印后出现'a'而不是 a 的值'1'也不是 para,para 只是一个参数名
---2021.3.4---
其实这个需求 是在我写代码的时候 想有没有办法优化代码想到的,如图
你传一个字符串不就行了。。。
666
def get_para_name(a):
all_val = list(locals().keys())
print(all_val[-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
使得传入一个变量 返回这个变量的变量名
这个需求好奇怪。原理上,运行时传入给函数的一般是变量的引用或者变量的值,本身就没有变量名信息。
**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
是这个意思吗?
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)