class host_struct(object):
host_id = dict()
host_license_id = dict()
def m(a):
eval(a)
host = host_struct()
m('host.host_id={1:1}')
print host
上面的代码不起作用,是我想要完成的一个示例。我试图解决一个问题,我需要调用一个类对象作为字符串的函数,但在函数中操作对象作为一个类。
这是我的问题:我有一个连接pooler / broker模块,它维护与服务器的持久连接。服务器在30分钟的所有连接上设置不活动TTL。因此,每隔29分钟,代理需要触摸服务器以维持持久连接。同时,连接代理需要处理将发送到服务器的客户端请求,并在服务器响应时将服务器的回复发送给客户端。
与服务器的通信是通过具有许多复杂对象的连接类进行的。因此,允许客户端模块直接操作类将完全绕过连接代理,这将导致服务器因TTL不活动而终止连接。
这可能吗?有没有更好的方法来解决这个问题?
这是一些额外的背景。我正在打开与VMWare vCenter的连接。要启动连接,我实例化连接类,然后调用连接方法。目前在我的客户端程序中,我现在正在做所有这些。但是我遇到了vCenter的问题,当我启动程序并在整个运行中使用相同的连接时需要连接一次。目前我正在打开与vCenter的连接,完成我的工作,关闭连接并睡眠一段时间,然后重复此过程。这种持续的连接/断开导致问题。所以我写了一个测试,看看我是否可以解决问题,我维持一个持久的连接,并且我成功了。
vcenter = VIServer()
vcenter.connect(*config_values)
此时,vcenter对象已连接到服务器。我需要进行几次方法调用来查询某些对象。以下是我使用的许多例子:
vms = vcenter._retrieve_properties_traversal(property_names=vm_objects,obj_type='VirtualMachine')
or
api_version = vcenter.get_api_version()
第一行将从服务器检索特定VM对象,第二行获取API版本。我想从连接代理调用此方法,因为他将保持与vCenter的连接打开。
因此,在我的连接代理中,我想将'vcenter.get_api_version()'作为字符串参数传递,并让连接代理执行api = vcenter.get_api_version()。
这有助于澄清吗?
答案 0 :(得分:0)
使用exec代替eval。例如:
class host_struct: # no need for parentheses if not inheriting from something besides object
host_id = {} # use of {} is more idiomatic than dict()
host_license_id = {}
def m(a):
exec a
host = host_struct()
m('host.host_id.update({1:1})') # updating will add to existing dict instead of replacing
print host.host_id[1]
运行此脚本会生成1
的预期输出。