Python 当在同一范围/功能中预先提及self时,self仅在评估范围内

Python 当在同一范围/功能中预先提及self时,self仅在评估范围内,python,python-3.x,scope,eval,format-string,Python,Python 3.x,Scope,Eval,Format String,在以下代码中,eval调用成功: 来自zeep导入客户端的 从zeep导入xsd 从zeep.plugins导入HistoryPlugin TrainAPI类: 定义初始化(自我,LDB_令牌): 如果LDB_令牌=='': 引发异常(“请配置您的OpenLDBWS令牌”) WSDL=http://lite.realtime.nationalrail.co.uk/OpenLDBWS/wsdl.aspx?ver=2017-10-01' history=HistoryPlugin() self.cl

在以下代码中,
eval
调用成功:

来自zeep导入客户端的

从zeep导入xsd
从zeep.plugins导入HistoryPlugin
TrainAPI类:
定义初始化(自我,LDB_令牌):
如果LDB_令牌=='':
引发异常(“请配置您的OpenLDBWS令牌”)
WSDL=http://lite.realtime.nationalrail.co.uk/OpenLDBWS/wsdl.aspx?ver=2017-10-01'
history=HistoryPlugin()
self.client=client(wsdl=wsdl,插件=[历史])
header=xsd.Element(
'{http://thalesgroup.com/RTTI/2013-11-28/Token/types}AccessToken',
xsd.ComplexType([
元素(
'{http://thalesgroup.com/RTTI/2013-11-28/Token/types}标记值',
xsd.String()),
])
)
self.header\u value=header(TokenValue=LDB\u TOKEN)
self.token=LDB_令牌
回来
def_u_ugetattr_u_u(自我,动作):
def方法(*args,**kwargs):
打印(操作、args、kwargs)
打印(自我)
返回eval(f“self.client.service.{action}(*args,**kwargs,_soapheaders=[self.header_value]))
返回方法
但是,如果删除了
print(self)
行,则会引发以下错误:

File "C:/Users/-/Documents/-/main.py", line 32, in method
    return eval(f"self.client.service.{action}(*args,**kwargs, _soapheaders=[self.header_value])")
  File "<string>", line 1, in <module>
NameError: name 'self' is not defined

也许我不明白作用域或格式字符串是如何工作的。

原因有点深入到python的工作原理,我可以告诉您是否确实需要,但要解决实际问题,答案是尽可能避免使用eval,因为通常有更好的方法。在这种情况下:

method = getattr(self.client.service, action)
return method(*args,**kwargs, _soapheaders=[self.header_value])

使用
eval
调试任何问题的第一步是询问如何在没有
eval
的情况下完成所需任务。