【无标题】

问:

背景:针对波分网管业界定义了通用的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分支中的代码更加简洁。

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

相关推荐

  1. 标题

    2024-06-17 13:28:05       71 阅读
  2. 标题

    2024-06-17 13:28:05       69 阅读
  3. 标题

    2024-06-17 13:28:05       67 阅读
  4. 标题

    2024-06-17 13:28:05       77 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 13:28:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 13:28:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 13:28:05       82 阅读
  4. Python语言-面向对象

    2024-06-17 13:28:05       91 阅读

热门阅读

  1. 微信小程序vant的使用

    2024-06-17 13:28:05       28 阅读
  2. Leetcode 438. 找到字符串中所有字母异位词

    2024-06-17 13:28:05       34 阅读
  3. 【面试经典150题】【双指针】392. 判断子序列

    2024-06-17 13:28:05       33 阅读
  4. Python数据分析与机器学习在金融风控中的应用

    2024-06-17 13:28:05       30 阅读
  5. Hashtable 基本用法及其与 HashMap 的区别

    2024-06-17 13:28:05       38 阅读
  6. Apache网页优化

    2024-06-17 13:28:05       34 阅读