【问题标题】:exec with customization string in python3在python3中使用自定义字符串执行
【发布时间】:2021-07-05 08:21:02
【问题描述】:

我想生成用户可以输入变量名的对象,但我不知道为什么在使用以下代码时会发生 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

【问题讨论】:

  • 尝试打印出你想要执行的字符串。如果这不能告诉您它有什么问题,请将其复制到交互式 Python shell 中。
  • exec('%s = Layer(%d,%d,%d,%s)'%(Name,d1,d2,d3,Name)) 。在这一行中,您使用了 Name 变量 2 次。首先它是“%d”,你给出的名字(字符串)
  • 嗨,Brian,如果您的问题得到解答并且您很清楚,请考虑accepting or upvoting

标签: python-3.x class exec customization


【解决方案1】:

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是一个字符串,但是你用它来创建一个带有它的代码sn-p。这个 sn-p 必须是有效的 Python 语法,需要添加引号。将 Name 的原始类型传递到字符串格式后就会消失。

【讨论】:

  • 但是我该如何纠正呢?我尝试使用 `str(Name)'。
  • 最奇怪的地方是为什么第一个名字很好,而第二个却不行……
  • 因为第一个 Trial 是您定义的变量的名称,而第二个 Trial 应该是一个字符串。
  • 谢谢,我现在找到了正确的方法来修复它。就是在'name'最后加上引号。
  • 是的,我只是将其添加到答案中以使其清楚。您是否清楚问题的原因及其解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多