Уведомления

Группа в Telegram: @pythonsu

#1 Март 25, 2017 00:09:43

Valera_idi_syuda
Зарегистрирован: 2015-10-09
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

Здавствуйте.
Функция является методом класса.
Допустим:
1) она вызвается из другого метода - один результат
2) пользователем в контексте объекта - другой
Возможно такое сделать? Не хочется писать еще одну фунцию, если можно обойтись одной.

Отредактировано Valera_idi_syuda (Март 25, 2017 00:11:08)

Офлайн

#2 Март 25, 2017 00:15:56

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

Передавать в качестве параметра функции флаг который будет определять что возвращать - такой вариант подойдет?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Март 25, 2017 00:18:20

Valera_idi_syuda
Зарегистрирован: 2015-10-09
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

JOHN_16
Передавать в качестве параметра функции флаг который будет определять что возвращать - такой вариант подойдет?
нет, функция без аргументов. Но если других вариантов нет, то можно добавить агрументы поумолчанию

Отредактировано Valera_idi_syuda (Март 25, 2017 00:21:58)

Офлайн

#4 Март 25, 2017 08:28:10

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

Вообще очень плохое поведение. Тут реально нужен флаг. Без флага возврат этой функции будет слегка присыпан магией, а это уже не хорошо и через полгодика выльется в боль…

Офлайн

#5 Март 25, 2017 10:02:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

Если функция делает два разных действия, нужно сделать из этого две функции. Так достигается функциональная прочность модуля. То есть функция конкретно отвечает на вопрос “что делает эта функция?”.

Вот пример функционально непрочного модуля (модуль из теории программирования, а не из питона)

  
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.



Отредактировано py.user.next (Март 25, 2017 10:14:05)

Офлайн

#6 Март 25, 2017 10:21:36

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

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...
Но это просто ужас…

Отредактировано scidam (Март 25, 2017 10:22:42)

Офлайн

#7 Март 25, 2017 10:39:06

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

scidam
Ну и на кой Вы это привели? Кто-то же скопипастит

Офлайн

#8 Март 25, 2017 14:13:55

Valera_idi_syuda
Зарегистрирован: 2015-10-09
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

То, что фунция возвращает зависит от места вызова.

Спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version