【无标题】

问:

背景:针对波分网管业界定义了通用的corba类及方法,如from idlpy.a_idlpy import emsSessionFactory_idl引入emsSessionFactory_idl对象,通过 emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I获取ems侧的会话工厂类,其包含getEmsSession()方法用于获取ems侧的会话。由于使用emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I较长且繁琐,现想创建一个IDLMapper类,用于将emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I赋值给self.EmsSessionFactory_I变量。后续即可idl_mapper = IDLMapper()获取类,通过idl_mapper.EmsSessionFactory_I.getEmsSession()的方式调用方法。现有三家厂商,分别通过a_idlpy、b_idlpy、c_idlpy引入emsSessionFactory_idl对象,目前初始化IDLMapper()时会传递firm字段,通过ifelse引进不同的idlpy文件,但有时会出现引入混乱的情况,请提供Python实现方式,供我完善和参考

答:

以下是一个可能的Python实现方式,用于根据传递的firm字段引入不同的idlpy文件,并将相应的对象赋值给`self.EmsSessionFactory_I`变量:

```python
class IDLMapper:
    def __init__(self, firm):
        if firm == 'a':
            from idlpy.a_idlpy import emsSessionFactory_idl
            self.EmsSessionFactory_I = emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I
        elif firm == 'b':
            from idlpy.b_idlpy import emsSessionFactory_idl
            self.EmsSessionFactory_I = emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I
        elif firm == 'c':
            from idlpy.c_idlpy import emsSessionFactory_idl
            self.EmsSessionFactory_I = emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I
        else:
            raise ValueError("Invalid firm")

idl_mapper = IDLMapper('a')  # 传递相应的firm字段
ems_session = idl_mapper.EmsSessionFactory_I.getEmsSession()  # 调用方法
```

在上述代码中,根据传递的`firm`字段,使用条件语句选择性地引入不同的`emsSessionFactory_idl`对象,并将相应的`EmsSessionFactory_I`赋值给`self.EmsSessionFactory_I`变量。然后,您可以通过创建`IDLMapper`实例并使用`idl_mapper.EmsSessionFactory_I.getEmsSession()`的方式调用方法。

请根据您的实际需求和代码结构进行适当的修改和完善。如果您有任何进一步的问题,请随时提问。

问:

我看到你提供的示例是每个ifelse中引入idlpy依赖后,均进行了赋值self.EmsSessionFactory_I = emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I。我实现时,由于该行一致,所以我使用ifelse时仅引入了idlpy依赖,将该行放在了ifelse的外边,作为统一的赋值。是不是因为这个原因导致加载混淆的呐?

答:

是的,您的理解是正确的。如果在每个ifelse分支中只引入idlpy依赖而没有进行赋值操作,而是将赋值操作放在ifelse外部,那么可能会导致加载混淆的情况。

这是因为Python的模块加载是一次性的,即在第一次导入模块时,会执行模块中的代码,并将结果保存在内存中。之后的导入操作只是从内存中获取已加载的模块,不会再次执行模块中的代码。

在您的情况下,如果将赋值操作放在ifelse外部,那么无论选择哪个分支,都会导致所有的idlpy依赖被加载。这可能会导致混淆,因为不同的idlpy依赖可能定义了相同的名称,导致命名冲突或覆盖。

为了避免加载混淆,建议将赋值操作放在每个ifelse分支中,确保只有选择的idlpy依赖被加载,并将相应的对象赋值给`self.EmsSessionFactory_I`变量。

如果您有任何进一步的疑问,请随时提问。

问:

因为存在多条赋值语句,那我可以将多条赋值语句封装成一个函数,然后在ifelse中引用该函数,目的是想减少代码冗余,这样的实现效果可以避免记载混淆嘛

答:

非常抱歉,我误解了您的意思。如果您只是想将`emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I`封装成一个函数,供ifelse分支中调用,那是完全可以的。

以下是一个示例代码:

```python
def get_EmsSessionFactory_I(emsSessionFactory_idl):
    return emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I

class IDLMapper:
    def __init__(self, firm):
        if firm == 'a':
            from idlpy.a_idlpy import emsSessionFactory_idl
            self.EmsSessionFactory_I = get_EmsSessionFactory_I(emsSessionFactory_idl)
        elif firm == 'b':
            from idlpy.b_idlpy import emsSessionFactory_idl
            self.EmsSessionFactory_I = get_EmsSessionFactory_I(emsSessionFactory_idl)
        elif firm == 'c':
            from idlpy.c_idlpy import emsSessionFactory_idl
            self.EmsSessionFactory_I = get_EmsSessionFactory_I(emsSessionFactory_idl)
        else:
            raise ValueError("Invalid firm")

idl_mapper = IDLMapper('a')  # 传递相应的firm字段
ems_session = idl_mapper.EmsSessionFactory_I.getEmsSession()  # 调用方法
```

在上述代码中,我们将`emsSessionFactory_idl._0_emsSessionFactory.EmsSessionFactory_I`封装成了`get_EmsSessionFactory_I`函数。该函数接受`emsSessionFactory_idl`作为参数,并返回相应的`EmsSessionFactory_I`对象。然后,在`IDLMapper`类的初始化方法中,我们调用`get_EmsSessionFactory_I`函数,并将返回的对象赋值给`self.EmsSessionFactory_I`变量。

这样做可以减少代码冗余,并使ifelse分支中的代码更加简洁。

非常抱歉之前的误解,希望这次的回答能够满足您的需求。如果您有任何进一步的问题,请随时提问。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值