2014-10-17 3 views
1

Мне сложно понять этот кусок кода. Я понимаю, что мы используем некоторый макет вместо конечной точки API, чтобы сэкономить время на тестах.classmethod lambda Python

То, что я не понимаю, является структурой classmethod (lambda cls: self.preapproval). В чем смысл использования lambda cls, если внутри кода я вообще не использую cls.

Я надеюсь, что я достаточно ясно, я был бы очень рад, если кто-то может пролить некоторый свет на этот ..

Спасибо большое.

@patch("paypaladaptive.api.endpoints.UrlRequest", 
     MockUrlRequestPreapproval) 
def test_preapproval(self): 
    # I don't understand this code, it is very confusing. Why do I need to use a lambda structure if in the code itself I don't use cls (self.preapproval) 
    MockUrlRequestPreapproval.preapproval = (
     classmethod(lambda cls: self.preapproval)) 
    self.assertTrue(self.preapproval.process()) 
    self.preapproval = Preapproval.objects.get(pk=self.preapproval.pk) 
    self.assertNotEqual(self.preapproval.preapproval_key, "") 
    self.assertEqual(self.preapproval.status, "created") 

ответ

1

Первый аргумент classmethod должен быть функцией, которая принимает один аргумент или больше. Вызов любого из это вызовет ошибку:

classmethod(self.preapproval) # Not a function 
classmethod(lambda: self.preapproval) # Needs one argument 

Это работает, но это слишком многословен:

def get_preapproval(cls): 
    return self.preapproval 

classmethod(get_preapproval) 

Вот почему этот код использует лямбда.

Вероятно, он может быть улучшен немного:

classmethod(lambda _: self.preapproval) 

Это делает очевидным, что этот аргумент не нужен.

+0

@ GP89 А, правильно, он может принимать> = 1, потому что класс должен быть передан. Благодаря! – parchment

+0

Это делает его намного яснее. Но почему нам нужен класс-метод в первом месте. Не могли бы мы поставить только лямбда? Или еще лучше, почему бы не просто: MockUrlRequestPreapproval.preapproval = self.preapproval – cyberjoac

+0

Я думаю, это потому, что остальная часть кода ожидает classmethod. Выполнение чего-либо еще может изменить поведение класса. @cyberjoac – parchment

0

cls - просто аргумент для лямбда! и вы не используете его вообще! lambda cls: self.preapproval) дает функцию objec для classmethod! , Поскольку lambda дает объект функции, вам нужно использовать его для прохождения self.preapproval из-за classmethod. Первый аргумент должен быть функциональным объектом!

+0

Как вы бы описали этот код, чтобы быть более читабельным? Почему это должен быть классный метод и использовать лямбду в первую очередь? – cyberjoac

+0

Поскольку lambda дает объект функции, вам нужно использовать его для pass 'self.preapproval', потому что' первый метод classmethod должен быть объектом функции! – Kasramvd

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