如何在python中进行变量替换

如何在python中进行变量替换,python,Python,我不知道该怎么称呼它,但我在TCL和Elixir中做过。当您替换一个变量以使代码更简单时。这是一种糟糕的解释方式。这个例子将说明: 以下是常规代码: def get(self, item): if item == 'name': return self.name elif item == 'age': return self.age 我想把它变成这样: def get(self, item): return self.%{item} 其

我不知道该怎么称呼它,但我在TCL和Elixir中做过。当您替换一个变量以使代码更简单时。这是一种糟糕的解释方式。这个例子将说明:

以下是常规代码:

def get(self, item):
    if item == 'name':
        return self.name
    elif item == 'age':
        return self.age
我想把它变成这样:

def get(self, item):
    return self.%{item}
其中,它将变量
项中的值解释为变量的名称。就像我说的,我用其他语言做过类似的事情,但我不知道它叫什么,也不知道如何用python来做

你能帮我吗?这种能力/风格叫什么?另外,如何在Python中实现这一点

这里有一个来自TCL的小例子

c:\repos\flow>tclsh
% set foo bar
bar
% set bar baz
baz
% puts $foo
bar
% puts [set $foo]
baz
查看
[set$foo]
如何本质上告诉解释器将
$foo
的值解释为变量名,即变量
bar
,然后命令
put
bar
作为变量,并打印出其值,即字符串
baz

您甚至可以使用Tcl中的命令来执行此类操作

% set a puts
puts
% $a hello\ world
hello world

您可以使用
getattr

def get(self, item):
  return getattr(self, item)
getattr
也可以像
getattr(object,attrname)
一样使用,其行为方式相同

然而,不得不这样做通常是不好的做法。你可能应该改用字典。 词典示例:

def __init__(self, whatever):
  self.stuff = {"name": "bob", "age": 40}

def get(self, item):
  return self.stuff[item]
另见:

如果要从全局或局部范围获取变量,可以使用:

a = 1
def f():
  b = 2
  print(globals()["a"])
  #print(globals()["b"]) fails, b is not global
  print(locals["b"]) # works, b is in the local scope
还有一种非常普遍的方式(也非常丑陋和不安全):


请不要使用此功能。

您可以使用
getattr

def get(self, item):
  return getattr(self, item)
getattr
也可以像
getattr(object,attrname)
一样使用,其行为方式相同

然而,不得不这样做通常是不好的做法。你可能应该改用字典。 词典示例:

def __init__(self, whatever):
  self.stuff = {"name": "bob", "age": 40}

def get(self, item):
  return self.stuff[item]
另见:

如果要从全局或局部范围获取变量,可以使用:

a = 1
def f():
  b = 2
  print(globals()["a"])
  #print(globals()["b"]) fails, b is not global
  print(locals["b"]) # works, b is in the local scope
还有一种非常普遍的方式(也非常丑陋和不安全):


请不要使用此方法。

您可以尝试以下方法:

class foo():
    cls_attr = "hello"
    def __init__(self):
        self.name = "i am foo"
        self.age = 0
        self.gender = None
        self.bar = "this is bar"
    def get(self, item):
        if item in foo.__dict__:
            return foo.__dict__[item]
        elif item in self.__dict__:
            return self.__dict__[item]
        else:
            return None

>>> f = foo()
>>> f.get('gender')
>>> f.get('bar')
'this is bar'
>>> f.get('name')
'i am foo'
>>> f.get('nothing')
>>> f.get('age')
0
>>> f.get('cls_attr')
'hello'
根据互联网用户的评论更新了我的答案。现在它应该同时返回实例和类属性


编辑:好吧,我不知道如何做超类属性(我的意思是我可能猜它是
super()。\uuuu dict\uuuu
),但最终互联网用户的答案是更好的版本。我将把这个答案留在这里,让未来的观众看到效率低下的方法进行比较。

您可以尝试以下方法:

class foo():
    cls_attr = "hello"
    def __init__(self):
        self.name = "i am foo"
        self.age = 0
        self.gender = None
        self.bar = "this is bar"
    def get(self, item):
        if item in foo.__dict__:
            return foo.__dict__[item]
        elif item in self.__dict__:
            return self.__dict__[item]
        else:
            return None

>>> f = foo()
>>> f.get('gender')
>>> f.get('bar')
'this is bar'
>>> f.get('name')
'i am foo'
>>> f.get('nothing')
>>> f.get('age')
0
>>> f.get('cls_attr')
'hello'
根据互联网用户的评论更新了我的答案。现在它应该同时返回实例和类属性



编辑:好吧,我不知道如何做超类属性(我的意思是我可能猜它是
super()。\uuuu dict\uuuu
),但最终互联网用户的答案是更好的版本。我将把这个答案留在这里,让未来的观众看到效率低下的比较方法。

直接访问
self.name
有什么不对?我不知道这是否重要,但在这个例子中,我想
item
将是一个传递到
def
的变量,因此它不会是类对象实例的一部分,但在本例中,它所指的将是一个实例变量,例如
name
,如
myInstance.get('name')
它没有问题,我只是在尝试学习另一种方法。在Python中不可能做这样的事情吗?基本上,我在寻找对Python解释器说的语法,“我给你一个变量,但我想看看这个变量的值,然后将该值解释为变量的名称,而不是字符串或其他东西。”也许是你要找的,但我不能完全确定。你能发布一个TCL或Elixir的等价物吗?直接访问
self.name
有什么问题吗?我不知道这是否重要,但在这个例子中我想
item
将是一个传递到
def
的变量,因此它不会是类对象实例的一部分,但在本例中,它所指的将是一个实例变量,例如
name
,如
myInstance.get('name')
它没有问题,我只是在尝试学习另一种方法。在Python中不可能做这样的事情吗?基本上,我在寻找对Python解释器说的语法,“我给你一个变量,但我想看看这个变量的值,然后将该值解释为变量的名称,而不是字符串或其他东西。”也许是你要找的,但我不能完全确定。你能发布一个TCL或长生不老药的等价物吗?这对于这个案例来说是非常棒的,但是有没有一个更通用的方法呢。我只是使用了Class属性的情况,因为这是我正在研究的,但是如果可能的话,我真的很关心学习python的一般功能。在这种情况下,我如何使用字典?我一般怎么做?你一般是什么意思?像任何对象一样,不仅仅是一个带有
.get
?我想这正是我的意思,这对于这个例子来说是非常棒的,但是有一种更通用的方法吗。我只是使用了Class属性的情况,因为这是我正在研究的,但是如果可能的话,我真的很关心学习python的一般功能。在这种情况下,我如何使用字典?我一般怎么做?你一般是什么意思?像任何对象一样,不仅仅是一个带有
.get
?我想这正是我的意思,这不适用于类属性。(即
foo.a=1
)@LegitStack它列出了对象的(可写)属性。
[]
只是请求返回字典的键
,以获取值(如果存在)。您可以在大多数对象上使用。这很好,但真的没有通用语法吗?如果我想用变量替换常规的旧变量,比如
foo='bar';bar='baz';打印(变量_替换)