您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python-将变量名作为字符串获取

Python-将变量名作为字符串获取

pip install python-varname

函数内部检索变量名

from varname import varname
def function():
    return varname()

func = function()
# func == 'func'

# available calls to retrieve
func = function(
    # ...
)

func = \
    function()

func = function \
    ()
# calls lead to failure of retrieving
func = [function()]

def function(*args):
    return varname()

func = function(
    1, # I
    2, # have
    3, # a
    4, # long
    5, # argument
    6, # list
)

# func == 'var_0'

def function(*args):
    return varname(context = 20)

func = function(
    1, # I
    2, # have
    3, # a
    4, # long
    5, # argument
    6, # list
)

# func == 'func'

varname 来电被深深掩埋

def function():
    # I kNow that at which stack this will be called
    return varname(caller = 3)

def function1():
    return function()

def function2():
    return function1()

func = function2()
# func == 'func'

class Klass:
    def __init__(self):
        self.id = varname()
    def copy(self):
        return varname()

k = Klass()
# k.id == 'k'

k2 = k.copy()
# k2 == 'k2'

varname调用被深埋在类中

class Klass:
    def __init__(self):
        self.id = self.some_internal()

    def some_internal(self):
        return varname(caller = 2)

    def copy(self):
        return self.copy_id()

    def copy_id(self):
        return self.copy_id_internal()

    def copy_id_internal(self):
        return varname(caller = 3)

k = Klass()
# k.id == 'k'

k2 = k.copy()
# k2 == 'k2'

varname静态索引的起始位置是0将变量名称标记为失败。

func = [function()]
# func == ['var_0']
func = function \
    ()
# func == 'var_1'

def function():
  return varname()
func = function

x = func() # unable to detect

误报

def func(**kwargs):
    return varname()
x = func(
    y = func()
)
# x == 'y'

# to avoid this, you have to write the kwargs
# in the same line where the is called
x = func(y=func())
# x == 'x'

Python中唯一具有规范名称的对象是模块,函数和类,并且在定义函数或类或导入模块后,当然不能保证此规范名称在任何命名空间中都具有任何含义。这些名称也可以在创建对象之后进行修改,因此它们可能并不总是特别值得信赖。

如果不递归地遍历命名对象的树,就不可能做到; 名称是对对象的单向引用。一个普通的或多种花园的Python对象不包含对其名称的引用。想象一下,如果要维护一个表示引用它的名称的字符串列表,是否需要每个整数,每个字典,每个列表,每个布尔值!这将是实现的噩梦,对程序员几乎没有好处。

python 2022/1/1 18:24:59 有440人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶