Это в основном зависит от того, как вы определили все эти функции.Если вы импортируете get_stuff
из другого модуля, второй подход более Pythonic, потому что с точки зрения ООП вы создаете функции для одной конкретной цели, и в этом случае, когда вы уже определили get_stuff
, вам не нужночтобы вызвать его в другой функции.
Если get_stuff
не определено в другом модуле, то это зависит от того, используете ли вы классы или нет.Если вы используете класс и хотите использовать все эти модули вместе, вы можете использовать метод для доступа к базе данных или для подключения к ней и использовать этот метод в других методах, таких как foo
.
Пример:
from some module import get_stuff
MyClass:
def __init__(self, *args, **kwargs):
# ...
self.stuff_id = kwargs['stuff_id']
def foo(self):
stuff = get_stuff(self.stuff_id)
# do stuff
Или, если функциональность foo
зависит от существования stuff
, вы можете иметь глобальный stuff
и просто проверить его правильность:
MyClass:
def __init__(self, *args, **kwargs):
# ...
_stuff_id = kwargs['stuff_id']
self.stuff = get_stuff(_stuff_id) # can return None
def foo(self):
if self.stuff:
# do stuff
else:
# do other stuff
Илидругой аккуратный шаблон проектирования для таких ситуаций может использовать функцию диспетчера (или метод в классе), который делегирует выполнение различным функциям в зависимости от состояния stuff
.
def delegator(stff, stuff_id):
if stuff: # or other condition
foo(stuff)
else:
get_stuff(stuff_id)