@1Bragim0ff

Параметры по-умолчанию Python?

Столкнулся с одной интересной проблемой.

def change(proxy=get()['proxy'], gmail=get()['gmail'], password=get()['password'], json_active=os.path.isfile(JSON_PATH)):
    ''' "change" changes the values ​​of config.json '''
    print(json_active)
    print(os.path.isfile(JSON_PATH))
    
    config = {
        'proxy': proxy,
        'gmail': gmail,
        'password': password,
        'json_active': json_active
    }

    with open(f'{os.getcwd()}\\config\\config.json', 'w') as file:
        json.dump(config, file, indent=1)

У меня есть функция change, параметру json_active передается результат метода isfile из модуля os.
Этот метод проверяет файл на существование и зависимо от этого возвращает значение True или False.

Теперь, я импортирую файл с моей функцией change в главный файл main.py.

def main():
    clear_terminal.clear()

    config.change()
    data = config.get()

    flag = input('>>> ')

    if flag == '1':
        
        USER_EMAIL = input('Your Gmail: ')

        number_combinations = email_combinate.combinate(USER_EMAIL)
        print(f'JSON generated, size: {number_combinations}')
        input('Press ENTER to continue')

        main()

При запуске функции main() из файла main.py где-то на старте, вызывается функция change. И изменяется config.json.
Так вот, если во время работы main.py создается файл, то в функции change параметр json_active всё равно равен False.

Но, если функцию change запускать без импортирования, то всё отрабатывает на ура.

Есть подозрения, что Python запоминает значения параметров по-умолчанию и в следующий раз присваивает им последнее значение параметра и всё это из-за компилированных файлов .pyc. Такое может быть?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 3
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Значения параметров по умолчанию определяется только один раз в момент запуска скрипта или импорта модуля.
Ответ написан
Комментировать
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Вычисление умолчаний происходит не в момент вызова, а в момент объявления функции. Не делайте так. Само собой у вас значение параметра по умолчанию осталост аким, каким оно было до создания файла.

Если не будете читать документацию, а станете писать наугад не изучая толком язык, у вас такой херни еще будет вагон. Хорошо хоть вы не медик, так бы пошли аппендицит оперировать наугад
Ответ написан
DMGarikk
@DMGarikk
Lead Software Developer
Это потому что вот так: "def change(proxy=get()['proxy']"
делать нельзя, значения по умолчанию вычисляются при инициализации - один раз, а не при каждом вызове
5eeb797234ec4123191909.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы