有没有一种方法能够将装饰器应用到Python数据结构上?

2024-06-16 12:02:23 发布

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

到目前为止,decorator应用于可调用函数(函数和类)。 想知道是否有一种方法可以将装饰器应用到词典中?(事实上,它可以是任何数据结构)。 我试图解决的问题大致如下: 我有很多字典,有时可能有效或无效。你知道吗

我想用一个装饰器来标记它们,比如,如下图所示…:

class Data(object):

    def invalide(self):
        return False

    def valide(self, some_dict):
        return some_dict

@Data.invalide  
dict_1 = {...}

@Data.valide  
dict_2 = {...}

@Data.valide  
dict_3 = {...}
...
...
@Data.invalide
dict_n = {...}

…所以,当我调用some_function(dict_x)时,它会知道根据valideinvalide标记做一件事或另一件事。你知道吗

-------------以后--------------------

我最终实现了以下目标:

In [2]: class Data(object):
   ...:     
   ...:     @classmethod
   ...:     def valide(self, func):
   ...:         #print "Data is valide."
   ...:         return func()
   ...:     
   ...:     @classmethod
   ...:     def invalide(self, func):
   ...:         #print "Data is invalide."
   ...:         return False
   ...:     

In [3]: @Data.valide
   ...: def dict1():
   ...:     return {"a": 1, "b": 2, "c": 3}
   ...: 
   ...: @Data.invalide
   ...: def dict2():
   ...:     return {"d": 4, "e": 4, "f": 6}
   ...: 
   ...: def run_funct(some_dict):
   ...:     return some_dict
   ...: 

In [4]: print(run_funct(dict1))
   ...: print type(run_funct(dict1))
   ...: 
{'a': 1, 'c': 3, 'b': 2}
<type 'dict'>

In [5]: print(run_funct(dict2))
   ...: print type(run_funct(dict2))
   ...: 
False
<type 'bool'>

Tags: runinselffalsedatareturndeftype
2条回答

你可以和房地产商和装修商拼凑一些东西:

def valid(func):
    return property(lambda self: func(self))
def invalid(func):
    return property(lambda self: False)

class A:
    @valid
    def dict1(self):
        return dict(a=4, b=5)
    @invalid
    def dict2(self):
        return dict(c=6, d=7)

用法如下:

a = A()
a.dict1
a.dict2

我不能说我会建议你这样做,但它应该能满足你的需要。你知道吗

据我所知,装饰器只能应用于可调用(函数、类等)

如果我在你的位置上,我可能会分离逻辑,在它自己的函数中决定有效/无效。你知道吗

相关问题 更多 >