关于python中变量名的黑暗魔法。
varname的Python项目详细描述
python中变量名的黑暗魔法
安装
pip install varname
特点
- 使用
varname
从函数/类调用内部获取变量名 - 直接使用
nameof
获取变量名 - 一个值包装器,用于存储使用
Wrapper
分配值的变量名 - 使用
will
检测下一个立即属性名 - 向类注入
__varname__
- {cd6>和函数的值。在
学分
感谢这些了不起的人/项目:
@alexmojaki | executing |
特别感谢@HanyuuLu为这个项目放弃pypi中的名称varname
。在
使用
从函数调用/类实例化内部检索变量名
- 在
从函数调用中
^{pr2}$ 在 - 在
varname
呼唤被深埋deffunction():# I know that at which stack this will be calledreturnvarname(caller=3)deffunction1():returnfunction()deffunction2():returnfunction1()func=function2()# func == 'func'
在 - 在
检索类的实例名称
classFoo:def__init__(self):self.id=varname()defcopy(self):# also able to fetch inside a method callcopied=Foo()# copied.id == 'copied'copied.id=varname()# assign id to whatever variable namereturncopiedk=Foo()# k.id == 'k'k2=k.copy()# k2.id == 'k2'
在 - 在
左侧有多个变量
# since v0.5.4deffunc():returnvarname(multi_vars=True)a=func()# a == ('a', )a,b=func()# (a, b) == ('a', 'b')[a,b]=func()# (a, b) == ('a', 'b')# hierarchy is also possiblea,(b,c)=func()# (a, b, c) == ('a', 'b', 'c')
在 - 在
一些不寻常的用途
func=[function()]# func == ['func']func=[function(),function()]# func == ['func', 'func']func=function(),function()# func = ('func', 'func')func=func1=function()# func == func1 == 'func'# a warning will be printed# since you may not want func1 to be 'func'x=func(y=func())# x == 'x'# get part of the namefunc_abc=function()[-3:]# func_abc == 'abc'# function alias supported nowfunction2=functionfunc=function2()# func == 'func'a=lambda:0a.b=function()# a.b == 'b'# Since v0.1.3# We can ask varname to raise exceptions# if it fails to detect the variable namedefget_name(raise_exc):returnvarname(raise_exc=raise_exc)a={}a['b']=get_name(True)# VarnameRetrievingErrora['b']=get_name(False)# None
在
值包装器
fromvarnameimportWrapperfoo=Wrapper(True)# foo.name == 'foo'# foo.value == Truebar=Wrapper(False)# bar.name == 'bar'# bar.value == Falsedefvalues_to_dict(*args):return{val.name:val.valueforvalinargs}mydict=values_to_dict(foo,bar)# {'foo': True, 'bar': False}
直接获取变量名
fromvarnameimportvarname,nameofa=1nameof(a)# 'a'b=2nameof(a,b)# ('a', 'b')deffunc():returnvarname()+'_suffix'f=func()# f == 'f_suffix'nameof(f)# 'f'# get full names of (chained) attribute callsfunc.a=funcnameof(func.a,full=True)# 'func.a'func.a.b=1nameof(func.a.b,full=True)# 'func.a.b'
正在检测下一个立即属性名
fromvarnameimportwillclassAwesomeClass:def__init__(self):self.will=Nonedefpermit(self):self.will=will(raise_exc=False)ifself.will=='do':# let self handle doreturnselfraiseAttributeError('Should do something with AwesomeClass object')defdo(self):ifself.will!='do':raiseAttributeError("You don't have permission to do")return'I am doing!'awesome=AwesomeClass()awesome.do()# AttributeError: You don't have permission to doawesome.permit()# AttributeError: Should do something with AwesomeClass objectawesome.permit().do()=='I am doing!'
将__varname__
注入类
fromvarnameimportinject_varname@inject_varnameclassDict(dict):passa=Dict(a=1)b=Dict(b=2)a.__varname__=='a'b.__varname__=='b'a.update(b)a=={'a':1,'b':2}
使用debug
调试
a='value'b=object()debug(a)# DEBUG: a='value'debug(b)# DEBUG: b=<object object at 0x2b70580e5f20>debug(a,b)# DEBUG: a='value'# DEBUG: b=<object object at 0x2b70580e5f20>debug(a,b,merge=True)# DEBUG: a='value', b=<object object at 0x2b70580e5f20>debug(a,repr=False,prefix='')# a=value
可靠性和局限性
varname
都依赖于executing
包来查找节点。
确保executing
检测到的节点是正确的(请参见this)。在
它部分适用于其他AST magics应用的环境,包括
pytest
、ipython
、macropy
、birdseye
、reticulate
与{executing
或{
例如:
- 在
这将不适用于
pytest
:a=1assertnameof(a)=='a'# do this insteadname_a=nameof(a)assertname_a=='a'
在 - 在
在R
与{}一起使用。在
- 项目
标签: