函数修饰符来指定def的前两行?

2024-10-02 22:33:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python 3.5:

我的一些python函数中有一个重复模式。对于大量的类集合,前两行是:

obj_a = <..... obtain something I need.....>
obj_b = <..... obtain another thing I need....>

我在这里简化它,但是获得obj_aobj_b的过程不是一个线性过程。。。我希望避免以比util函数更优雅的方式在任何地方重复此代码以获得obj_aobj_b(例如obj_a = getObjectA()…)

有没有什么方法可以把这些行作为函数的装饰器的一部分,比如:

@function_where_I_need_my_objects
def foo:
  <....do something with obj_a and obj_b already initialized....>

Tags: 函数代码obj过程地方util方式模式
3条回答

obj_aobj_b听起来很像状态。你知道吗

class Thing:
    def __init__(self):
        # These could also be class attributes instead
        # if they can be initialized when Thing is first
        # defined.
        self.obj_a = ...
        self.obj_b = ...

    def foo(self):
        # use self.obj_a and self.obj_b

t = Thing()
t.foo()

也可以定义一个decorator来返回obj_aobj_b附近的闭包。你知道吗

def decorator(f):
    obj_a = ...
    obj_b = ...
    def _():
       # use obj_a and obj_b
    return _

@decorator
def foo():
    ...

然而,简单地编写一个函数,返回两个对象,并让调用者使用他们喜欢的任何名称,这几乎不再是一个更灵活的方法了:

def _get_a_b():
    a = ...
    b = ...
    return a, b

def foo():
   obj_a, obj_b = _get_a_b()
   ...

def bar():
    a1, a2 = _get_a_b()
    ...

您可以像下面这样创建变量,当函数被调用时,这些变量将有效地成为函数的局部变量。这将使用eval(),如果在不受信任的输入上使用,这可能是不安全的,但在这里,它不是用来执行修饰函数的编译字节码的情况(而是caveat emptor)。你知道吗

def local_vars(**kwargs):
    """ Create decorator which will inject specified local variable(s) into
        function before executing it.
    """
    def decorator(fn):
        def decorated():
            return eval(fn.__code__,
                        {k: v() for k, v in kwargs.items()}) # call funcs
        return decorated
    return decorator

def get_object_a(): return 13
def get_object_b(): return 42

# create abbreviation for the long decorator
obj_decorator = local_vars(obj_a=get_object_a, obj_b=get_object_b)

@obj_decorator  # apply decorator
def test():
    print(obj_a)
    print(obj_b)

test()

输出:

13
42

可以将这两个对象放在基类中,如下所示:

class TheBaseClass:
    obj1 = something
    obj2 = something_else

并在所需类的函数中继承:

class Class1(TheBaseClass):
    def func1(self):
       a = self.obj1  # make use of it
       b = self.obj2  # make use of it

相关问题 更多 >