Найти - Пользователи
Полная версия: То, что фунция возвращает зависит от места вызова.
Начало » Python для новичков » То, что фунция возвращает зависит от места вызова.
1
Valera_idi_syuda
Здавствуйте.
Функция является методом класса.
Допустим:
1) она вызвается из другого метода - один результат
2) пользователем в контексте объекта - другой
Возможно такое сделать? Не хочется писать еще одну фунцию, если можно обойтись одной.
JOHN_16
Передавать в качестве параметра функции флаг который будет определять что возвращать - такой вариант подойдет?
Valera_idi_syuda
JOHN_16
Передавать в качестве параметра функции флаг который будет определять что возвращать - такой вариант подойдет?
нет, функция без аргументов. Но если других вариантов нет, то можно добавить агрументы поумолчанию
4kpt_V
Вообще очень плохое поведение. Тут реально нужен флаг. Без флага возврат этой функции будет слегка присыпан магией, а это уже не хорошо и через полгодика выльется в боль…
py.user.next
Если функция делает два разных действия, нужно сделать из этого две функции. Так достигается функциональная прочность модуля. То есть функция конкретно отвечает на вопрос “что делает эта функция?”.

Вот пример функционально непрочного модуля (модуль из теории программирования, а не из питона)
  
def f(a, b):
    if a > 0:
        return a * b
    else:
        return a + b
Что делает f()? Да хрен его знает, возвращает ни пойми что в зависимости от непонятно чего.

Вот он раскладывается на функционально прочные модули:
  
def f1(a, b):
    return a * b
 
def f2(a, b):
    return a + b
 
if a > 0:
    n = f1(a, b)
else:
    n = f2(a, b)

Что делает f1()? Вычисляет произведение a и b.
Что делает f2()? Вычисляет сумму a и b.
scidam
Valera_idi_syuda
Возможно такое сделать?

Сотворить это, пожалуй, можно:

 import inspect
class A:
    def sam(self):
        if 'self.' + inspect.stack()[0].function in inspect.stack()[1].code_context[0]:
            print('Hey, I was invoked from another class method...')
        else:
            print('Hey, I was called as an instance method...')
    def sim(self):
        self.sam()
a = A()
a.sam()
# Hey, I was called as an instance method...
a.sim()
# Hey, I was invoked from another class method...
Но это просто ужас…
4kpt_V
scidam
Ну и на кой Вы это привели? Кто-то же скопипастит
Valera_idi_syuda
Спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB