2015-04-23 3 views
6

Я создаю небольшой модуль-оболочку для публичной библиотеки, в библиотеке много повторений, где после создания объекта, возможно, методы требуют одинаковых элементов данных.Оформление метода в python

Мне нужно передать те же данные в моем классе-оболочке, но не очень хочется передавать одно и то же снова и снова. Поэтому я хотел бы сохранить данные в моем классе-оболочке и применить его, если он не включен в этот метод. Однако, если что-то пойдет по дороге, я хочу, чтобы аргументы метода перезаписывали стандартные значения по умолчанию. Вот фрагмент кода, который иллюстрирует мои цели.

class Stackoverflow(): 
    def __init__(self,**kwargs): 
     self.gen_args = {} 
     #Optionally add the repeated element to the object 
     if 'index' in kwargs: 
      self.gen_args['index'] = kwargs['index'] 
     if 'doc_type' in kwargs: 
      self.gen_args['doc_type'] = kwargs['doc_type'] 

    #This is where the problem is   
    def gen_args(fn): 
     def inner(self,*args,**kwargs): 
      kwargs.update(self.gen_args) 
      return fn(*args,**kwargs) 
     return inner 

    #There is a bunch of these do_stuffs that require index and doc_type 
    @gen_args 
    def do_stuff(self,**kwargs): 
     print(kwargs['index']) 
     print(kwargs['doc_type']) 

#Just send arguments up with the method 
print("CASE A")   
a = Stackoverflow() 
a.do_stuff(index=1,doc_type=2) 

#Add them to the class and have all methods use them without having to specify 
#them each time 
print("CASE B") 
b = Stackoverflow(index=1,doc_type=2) 
b.do_stuff() 

#The arguments specified in the method should overwrite class values 
print("CASE C") 
c = Stackoverflow(index=1,doc_type=2) 
c.do_stuff(index=3,doc_type=4) 

EDIT:

Таким образом, вопрос, как я могу исправить gen_args или есть лучший способ сделать это? Специфическая ошибка я получаю с этим кодом: возвращение п (* арг ** kwargs) TypeError: do_stuff() отсутствует 1 необходимые позиционная аргумент: «я»

+1

В чем Ваш вопрос? –

+0

Обновлено сообщение, Надстройка выше явно не работает, поэтому очевидный вопрос заключается в том, как заставить его делать то, что я хочу, чтобы он делал. – browskie

+0

Как это происходит? Выдает ли сообщение об ошибке или приводит к неправильным результатам? Какой результат вы ожидаете, и какой результат вы на самом деле получаете? –

ответ

5

Я мог бы использовать это определение inner:

def inner(self,*args,**kwargs): 
     return fn(self, *args,**dict(self.gen_args, **kwargs)) 

Примечания:

  • Эта версия обеспечивает self, который отсутствует в вашей версии.
  • Это дает приоритет прошедшему kwargs.
+0

ага .... Я вижу, что вы там делали. Я даже не думал о приоритете кваргов. Очень хорошо. Спасибо – browskie

Смежные вопросы