Найти - Пользователи
Полная версия: Переменные и функции
Начало » Python для новичков » Переменные и функции
1 2
kampella
Подскажите. Хорошая ли практика использования переменных в функциях следующим методом:

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

Конкретно интересует переменная var. Просто бывает что много статичных переменных и не хочется все пихать в аргументы.
botinag
def foo(x, var='data'): 
    r = var + x
    return r

не нравится?
kampella
botinag

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

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

P.S. Вижу код с глобальными переменными - закрываю сразу, чтобы карму себе не портить
Metallikus
Тогда так?
class dater:
    __var = 'data'
    def foo(self, x): 
        r = self.get_var() + x
        return r
    
    def get_var(self):
        return __var
4kpt_II
Ну почему бы не сделать ее просто атрибутом класса Ведь доступ к этому атрибуту будут иметь все методы класса…

Ну и как правильно Вы заметили, по соглашению, атрибуты для внутреннего использования начинаются с “__”.
Alen
kampella
Подскажите. Хорошая ли практика использования переменных в функциях следующим методом:

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

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

Ну так для этого есть конструкция вида **kwargs и тип данных “словарь”.
4kpt_II
Alen
Глобальные переменные, во-первых это медленней, во-вторых рано или поздно появится пересечение пространства имен.

Не только. Сборщику мусора идея использовать глобальные переменные тоже не очень нравится
py.user.next
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;
}

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

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