Делая это, вы на самом деле не получаете много, на самом деле это замедляется 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класса). Кроме того, вложенная функция фактически вызывается в этой версии, в отличие от вашей.