关于python中变量名的黑暗魔法。

varname的Python项目详细描述


varname

PypiGithubPythonVersBuildingDocs and API{a5} Chat on gitter

python中变量名的黑暗魔法

Change Log| API

安装

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应用的环境,包括 pytestipythonmacropybirdseyereticulate与{}等都不是 executing或{}是100%在这些环境中工作的。使用 你自己承担风险。在

例如:

  • 这将不适用于pytest

    a=1assertnameof(a)=='a'# do this insteadname_a=nameof(a)assertname_a=='a'
  • R与{}一起使用。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
io如何从java中的远程FileInputStream中知道扩展名为的文件名   java spring引导不会为JSP返回404,除非编译tomcat maven依赖范围?   ArchUnit:如何避免对java类的依赖冲突   java Hibernate很多都不工作   java tomcat基于表单的身份验证数据源配置错误   java将随机对象声明为私有静态最终属性可以吗?   java Sobel筛选器无法正常工作   我想用java为hangman乘以一个字符串   当我试图运行部署在Tomcat中的任何项目时,ubuntu上的java Tomcat服务器将自动关闭   java更高效地读取按字母顺序排序的文本文件   java Android Studio“尚未附加片段”   在JavaServlet中使用从一种形式到另一种形式的数据的html   检测Java中打开的文件夹(JNativeHook)   jakarta ee Hibernate映射异常:实体映射中的重复列   httpSession在Java中使用什么方法进行会话管理   java如何将两个类的代码外包到一个新的类中,以便两个类都可以调用该方法