Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 27, 2014 16:12:10

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

Переменные и функции

Подскажите. Хорошая ли практика использования переменных в функциях следующим методом:

var = 'data'
def foo(x): 
    r = var + x
    return r

Конкретно интересует переменная var. Просто бывает что много статичных переменных и не хочется все пихать в аргументы.

Офлайн

#2 Ноя. 27, 2014 19:14:58

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Переменные и функции

def foo(x, var='data'): 
    r = var + x
    return r

не нравится?

Отредактировано botinag (Ноя. 27, 2014 19:15:34)

Офлайн

#3 Ноя. 27, 2014 19:53:37

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

Переменные и функции

botinag

Можно и так, но повторю вопрос: есть л в этом практический смысл? Ведь var видна и извне функции?

Офлайн

#4 Ноя. 27, 2014 20:16:46

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

Переменные и функции

А ты var какими-то функциями изменять собираешься? Если да, то всё нормально. PEP8 не содержит пункта “Ни при каких условиях не используйте глобальные переменные”

Отредактировано Metallikus (Ноя. 27, 2014 20:17:04)

Офлайн

#5 Ноя. 27, 2014 20:44:28

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Переменные и функции

Глобальные переменные не есть айс. Это известно всем. Не использую никогда. В свое время отгреб массу проблем …

P.S. Вижу код с глобальными переменными - закрываю сразу, чтобы карму себе не портить

Отредактировано 4kpt_II (Ноя. 27, 2014 20:46:47)

Офлайн

#6 Ноя. 27, 2014 21:00:13

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

Переменные и функции

Тогда так?

class dater:
    __var = 'data'
    def foo(self, x): 
        r = self.get_var() + x
        return r
    
    def get_var(self):
        return __var

Офлайн

#7 Ноя. 27, 2014 21:04:31

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Переменные и функции

Ну почему бы не сделать ее просто атрибутом класса Ведь доступ к этому атрибуту будут иметь все методы класса…

Ну и как правильно Вы заметили, по соглашению, атрибуты для внутреннего использования начинаются с “__”.

Офлайн

#8 Ноя. 27, 2014 23:27:47

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Переменные и функции

kampella
Подскажите. Хорошая ли практика использования переменных в функциях следующим методом:

Глобальные переменные, во-первых это медленней, во-вторых рано или поздно появится пересечение пространства имен.

kampella
Просто бывает что много статичных переменных и не хочется все пихать в аргументы.

Ну так для этого есть конструкция вида **kwargs и тип данных “словарь”.

Офлайн

#9 Ноя. 28, 2014 00:20:58

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Переменные и функции

Alen
Глобальные переменные, во-первых это медленней, во-вторых рано или поздно появится пересечение пространства имен.

Не только. Сборщику мусора идея использовать глобальные переменные тоже не очень нравится

Офлайн

#10 Ноя. 28, 2014 01:14:07

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

Переменные и функции

kampella
Хорошая ли практика использования переменных в функциях следующим методом:
Есть переменные, есть константы. Константы принято именовать верхним регистром. Константы используются часто (re.MULTILINE, tkinter.constants.SOLID).
А переменные можно делать общими внутри класса (глобальные объекты исполнителя). Если у тебя модуль питона является исполнителем, можно так сделать, но, как правило, исполнителя делают в виде класса. В языках, где классов нет, исполнителей делают в файлах.

Пример стека целых чисел из C:
int val[100];
int sp = 0;

void stack_push(int num)
{
val[sp++] = num;
}

int stack_pop(void)
{
if (sp > 0)
return val[--sp];
else
return 0;
}

void stack_clear(void)
{
sp = 0;
}

int stack_isempty(void)
{
return sp == 0;
}

Соответственно, хоть переменные и глобальные, но используются только этими несколькими функциями и для одной цели - хранить состояние исполнителя.

Если же в общем смысле смотреть, используются ли глобальные переменные ради удобства, то не используются. И это пишут в каждой книге и объясняют, почему.



Отредактировано py.user.next (Ноя. 28, 2014 01:16:37)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version