如何在python中进行变量替换
我不知道该怎么称呼它,但我在TCL和Elixir中做过。当您替换一个变量以使代码更简单时。这是一种糟糕的解释方式。这个例子将说明: 以下是常规代码:如何在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} 其
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';打印(变量_替换)