使用未实例化的类作为名称空间来组织对象?

时间:2019-06-19 18:47:12

标签: python namespaces

我建立了一个模块来保存所有常见硒预期条件,然后在各种测试中都将其引用。 (此示例中的硒部分并不重要,仅是我拥有数千种“目录”的事实。)

# ec module
class EcHR(object):
    class sidemenu(object):
        hrfile: Clickable      = Clickable((By.ID, "sidemenu_HRFile"),       f"HR File")
        hrvistainfo: Clickable = Clickable((By.ID, "sidemenu_HRVistA Info"), f"HR VistA Info")
    class hrfile(__hr_search__):
        class actionmenu(__hr_search__.actionmenu):
            add: Clickable       = Clickable((By.ID, "NewHireLink"), f"Add {BUTTON}")
            personnel: Clickable = Clickable((By.ID, 'setEmpType'), f"Personnel Filter {DROPDOWN}")
            status: Clickable    = Clickable((By.ID, 'setStatus'), f"Status {DROPDOWN}")
            configure: Clickable = Clickable((By.ID, "configureLinkGen"), f"Configure {BUTTON}")
            reports: Clickable   = Clickable((By.ID, 'Reports'), f"Reports {BUTTON}")
            class addmenu(object):
                employee: Clickable = Clickable((By.ID, f'Employee'), f"Add->Employee {BUTTON}")

在ec模块中对给定项目的示例引用。

import ec

    # navigation helper method for a given page
    def do_hrfile_nav(self):
        self.clickbutton(ec.EcHR.sidemenu.hrfile)

这很好用;我可以跟踪每个对象的用法,同时仍然提供对象的可读性上下文。

self.clickbutton(ec.EcHR.sidemenu.hrfile)告诉读者我们正在单击hrfile页面上的补充菜单项HR。区别于ec.EcHR.hrfile是一组不同的对象,这一点很重要。

我的问题:是否有更好/更干净的方法来组织这些对象?我正在使用永远不会实例化的类。 (由于我无法阐明的原因,这感觉有些尴尬)这些类仅作为一种以有组织的方式引用它们的方法。也许某种具有类结构的轻量级数据对象? (我在考虑问题吗?)

1 个答案:

答案 0 :(得分:1)

我有一些想法。 可能有用。

如何将函数用作名称空间?

@namespace
def EcHR():
    @namespace
    def sidemenu():
        hrfile: Clickable = Clickable((By.ID, "sidemenu_HRFile"), f"HR File")
        return locals()

    @namespace
    def hrfile():
        @namespace
        def actionmenu():
            add: Clickable = Clickable((By.ID, "NewHireLink"), "Add {BUTTON}")

            @namespace
            def addmenu():
                employee: Clickable = Clickable(
                    (By.ID, f"Employee"), "Add->Employee {BUTTON}"
                )
                return locals()

            return locals()

        return locals()

    return locals()

我已将每个class更改为一个函数。而且每个函数都必须使用namespace装饰器进行修饰,并且必须返回locals()或任何具有自定义键,val映射的dict

这里是NameSpace类和namespace装饰器。

from functools import reduce

class NameSpace:
    def __init__(self, name):
        self.__name__ = name

    def __str__(self):
        return "{}".format(self.__name__)

    def __repr__(self):
        return "NameSpace({})".format(self.__name__)

    def __call__(self):
        pass

def namespace(func):
    return reduce(
        lambda ns, kv: setattr(ns, kv[0], kv[1]) or ns,
        func().items(),
        NameSpace(func.__name__),
    )

namespace装饰器运行装饰后的函数,并将返回的dict转换为NameSpace实例。

如何访问对象?

print(EcHR.sidemenu.hrfile)
print(EcHR.hrfile.actionmenu.addmenu.employee)