在 python3 中使用自定义字符串执行
exec with customization string in python3
我想生成一个用户可以输入变量名的对象,但是我不知道为什么在使用以下代码时会出现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
但是,如果我删除了“name”,如下所示:
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
替换为 print
给出了错误提示:
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
的原始类型传递给字符串格式,它就会消失。
我想生成一个用户可以输入变量名的对象,但是我不知道为什么在使用以下代码时会出现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
但是,如果我删除了“name”,如下所示:
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
替换为 print
给出了错误提示:
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
的原始类型传递给字符串格式,它就会消失。