我想生成用户可以输入变量名的对象,但是我不知道为什么在我使用以下代码时会发生 Nameerror:
class Layer:
def __init__(self,Diameter,Thickness,Porosity,Name):
self.d = Diameter
self.t = Thickness
self.phi = Porosity
self.name = Name
Name = input('Name of the layer: ')
d1 = 1
d2 = 2
d3 = 3
exec('%s = Layer(%d,%d,%d,%s)'%(Name,d1,d2,d3,Name))
如果我有这样的输入
Name of the layer: Trial
然后出现如下错误:
NameError: name 'Trial' is not defined
我尝试过其他一些方法,例如:
class Layer:
def __init__(self,Diameter,Thickness,Porosity,Name):
self.d = Diameter
self.t = Thickness
self.phi = Porosity
self.name = Name
Name = input('Name of the layer: ')
name = Name
d1 = 1
d2 = 2
d3 = 3
exec('%s = Layer(%d,%d,%d,%s)'%(Name,d1,d2,d3,name))
即使是这样的事情也失败了:
class Layer
def __init__(self,Diameter,Thickness,Porosity,Name):
self.d = Diameter
self.t = Thickness
self.phi = Porosity
self.name = Name
Name = input('Name of the layer: ')
name = 'Trial2'
d1 = 1
d2 = 2
d3 = 3
exec('%s = Layer(%d,%d,%d,%s)'%(Name,d1,d2,d3,name))
并返回 NameError: name 'Trial2' is not defined
但是,如果我删除了“名称”,如下所示:
class Layer:
def __init__(self,Diameter,Thickness,Porosity):
self.d = Diameter
self.t = Thickness
self.phi = Porosity
self.name = Name
Name = input('Name of the layer: ')
d1 = 1
d2 = 2
d3 = 3
exec('%s = Layer(%d,%d,%d)'%(Name,d1,d2,d3))
可以生成对象。但它随后失去了属性name
。
替换exec
withprint
给出了错误的提示:
print('%s = Layer(%d,%d,%d,%s)'%(Name,d1,d2,d3,Name))
给
Trial = Layer(1,2,3,Trial)
^^^^^ here is the problem
但你真正需要的是
Trial = Layer(1,2,3,"Trial")
因为最后一个参数应该是一个字符串。否则,Python 将查找名为 的变量Trial
,但找不到,因此会引发NameError
. 转换回您的代码,这意味着在第二次出现的 周围添加引号Name
:
exec('%s = Layer(%d,%d,%d,"%s")'%(Name,d1,d2,d3,Name))
这样做的原因是虽然Name
是一个字符串,但您可以使用它来创建一个代码片段。此代码段必须是需要添加引号的有效 Python 语法。Name
一旦您将其传递到字符串格式中,原始类型就会消失。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句