在 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 的原始类型传递给字符串格式,它就会消失。