Ви насправді не дуже заробляєте це, насправді він сповільнюється method_a
, оскільки він визначатиме та перекомпілює іншу функцію кожного разу, коли вона викликається. Враховуючи це, було б, мабуть, краще просто приєднати ім’я функції з підкресленням, щоб вказати, що це приватний метод - тобто_method_b
.
Я вважаю , ви могли б хотіти зробити це , якщо визначення вкладеної функції варьировало кожен раз , коли з якоїсь - то причини, але це може вказувати на недолік у вашому дизайні. Однак, для цього є поважна причина, щоб дозволити вкладеній функції використовувати аргументи, передані до зовнішньої функції, але не передані їм явно, що іноді виникає, наприклад, при написанні декораторів функції. Це те, що показано у прийнятій відповіді, хоча декоратор не визначений і не використовується.
Оновлення:
Ось доказ того, що гніздування їх відбувається повільніше (використовуючи Python 3.6.1), хоча, мабуть, не дуже в цьому тривіальному випадку:
setup = """
class Test(object):
def separate(self, arg):
some_data = self._method_b(arg)
def _method_b(self, arg):
return arg+1
def nested(self, arg):
def method_b2(self, arg):
return arg+1
some_data = method_b2(self, arg)
obj = Test()
"""
from timeit import Timer
print(min(Timer(stmt='obj.separate(42)', setup=setup).repeat())) # -> 0.24479823284461724
print(min(Timer(stmt='obj.nested(42)', setup=setup).repeat())) # -> 0.26553459700452575
Примітка. Я додав деякі self
аргументи до ваших функцій вибірки, щоб зробити їх більш схожими на реальні методи (хоча method_b2
технічно все ще не є методом Test
класу). Також вкладена функція насправді викликається у цій версії, на відміну від вашої.