如何防止python

时间:2015-10-14 17:27:59

标签: python-3.x import constructor

我有一个复杂的类层次结构,它涉及利用各种OS命令在自动化库中为它们提供统一的API。其中一些命令通过cli接口访问,其他命令通过基于休息的接口访问,其中的类具有如下的包名:

cmd.interface.cli.mgmt
cmd.interface.cli.support
cmd.interface.rest

cmd.driver.cli.network_config
cmd.result.cli.network_config

cmd.driver.cli.stats
cmd.result.cli.stats

cmd.driver.rest.network_interface
cmd.result.rest.network_interface

等等。

有很多这些,它们都是逻辑分组的,并且具有基类的层次结构,它们都包含一个基本上与包路径中最后一个文件名相同的类定义。

即导入语句,然后是"构造函数"用法看起来像这样:

import cmd.driver.cli.network_config
.
.
.
config_driver = cmd.driver.cli.network_config.NetworkConfig(...)

我发现这种类访问中的冗余非常烦人,而且它使代码看起来很愚蠢。

是否有一种很好的方法可以在保持模块独立且完整的同时删除此命名冗余?

我做的一些事情想要解决此问题:

1

from cmd.driver.cli.network_config import NetworkConfig as CliDriverNetworkConfig
from cmd.result.cli.network_config import NetworkConfig as CliResultNetworkConfig
from cmd.driver.rest.network_config import NetworkConfig as RestDriverNetworkConfig

(啊!)

我不想假装这些东西都有可爱的名字。我真的想在使用时公开所有相关信息

config_driver = cmd.driver.cli.network_config.NetworkConfig(...)

(但我真的很想,这应该足以使代码可以理解:

config_driver = cmd.driver.cli.NetworkConfig(...)

  1. 在cmd / driver / cli / __ init __中添加了30个左右的类def.py
  2. (也很难)

    在perl中,这将以这种方式完成:

    use Cmd::Driver::CLI::Network_Config;
    .
    .
    .
    my $config_driver = Cmd::Driver::CLI::Network_Config->new(...);
    

    在python中是否有任何机制可以让我更简洁地调用这些类上的构造函数而不需要包名称冗余,并且不会隐藏几个具有相似但可靠的不同完整名字被称为?

    ...............................................

    后+ 1小时的其他评论:

    在我看来,perl也在做同样的事情,其中​​包是C​​md :: Driver :: CLI :: Network_Config,其中调用的类方法是' new'。因此,在这种情况下,调用的外观更漂亮。

    我想如果我将模块命名为cmd.driver.cli.NetworkConfig并放置一个名为' new'的程序包范围方法。只调用cmd.driver.cli.NetworkConfig.NetworkConfig(...)我会得到相同的效果,这样我就可以进行调用:

    import cmd.driver.cli.NetworkConfig
    .
    .
    .
    config_driver = cmd.driver.cli.NetworkConfig.new(...)
    
    嗯......我意识到这可能不是" pythonic"从几个方面来说,我不喜欢在幕后捣乱(这种事情总是有风险),但也许这就是我想要的东西,如果我死了在它...

    ...............................................

    在+ 1周后的其他评论:

    天哪没有投票?有点严肃的问题。也许我不应该说我如何在Perl中做到这一点......: - 啊啊,好吧。

2 个答案:

答案 0 :(得分:0)

我的命题:例如,使用__ import__来定义你的函数。

config_driver = myInit('cmd.driver.cli', ...)

并使用

$var = 'ی - این یک متن تست است';

echo preg_replace('/^\p{L}\h+-\h+/u', '', $var);
//=> این یک متن تست است

答案 1 :(得分:0)

在顶级模块或__init__.py中尝试类似的内容:

# import submodules, exposing them to things that import this module directly

from cmd.interface.cli import mgmt
from cmd.interface.cli import support
from cmd.interface import rest

from cmd.driver.cli import stats as driver_stats
from cmd.result.cli import stats as result_stats

# hide unneeded variables from things that import this module (optional)

__all__ = ['mgmt', 'support', 'rest', 'driver_stats', 'result_stats']

这会将简化名称作为模块成员变量公开给引用根模块的任何内容。您甚至可以在层次结构的多个级别上执行此模式的变体。