Python убедитесь, что () не передаются в параметре

У меня есть функция, которая отлично работает, если в имени функции не используется ():

answer = message.AskQuestion(
    self.loc_top, thread=self.refresh_play_top, align='left',
    icon='warning', title = "Forget Location Confirmation", text=text)

Если я случайно использую (), E.G. thread=self.refresh_play_top() функция возвращает поврежденные данные:

answer = message.AskQuestion(
    self.loc_top, thread=self.refresh_play_top(), align='left',
    icon='warning', title = "Forget Location Confirmation", text=text)

Внутри функции .AskQuestion() есть это:

self.thread = thread        # The thread run before button click

Как это можно изменить?


Решение

Используя принятый ответ:

  • Измените функцию self.refresh_play_top(), чтобы она всегда возвращала True или False, включая завершение функции, которая по умолчанию возвращает None.
  • Добавьте 7 строк кода в функцию AskQuestion() (показана внизу):
    def __init__(self, parent, text=None, confirm='yes',
                 align='center', thread=None, icon='warning'):

        self.top_level = parent     # Allows .after() calls
        self.confirm = confirm      # Append "Are you sure?" line?
        self.align = align          # data (text lines) alignment
        if thread is None:
            self.thread = None
        elif callable(thread):
            self.thread = thread    # The thread run before button click
        else:
            print("message.py, CommonSelf, invalid thread= passed")
            self.thread = None

  • Тестировать, исправлять, тестировать, исправлять, текст, исправлять :)

Спасибо экспертам, которые оперативно прокомментировали и ответили.

Используйте подсказки типа, чтобы указать, что аргумент thread должен быть Callable. Тогда ваша IDE или средство проверки типов, например mypy, предупредит вас, если вы назовете его неправильно.

Barmar 24.04.2023 22:44

Вы можете пойти дальше. Это статическая проверка типов; вы можете проверить это во время выполнения, например. stackoverflow.com/a/65505019/4799172

roganjosh 24.04.2023 22:50

Отвечает ли это на ваш вопрос? Узнайте, можно ли вызывать объект Python

roganjosh 24.04.2023 22:51

@Barmar Я использую PyCharm, но еще не эту функцию. Спасибо!

WinEunuuchs2Unix 24.04.2023 23:02

@roganjosh Да и нет. Я отредактировал вопрос с решением. Пожалуйста, сообщите, если я должен закрыть как дубликат.

WinEunuuchs2Unix 25.04.2023 02:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если у вас когда-либо будет () в конце, python попытается вызвать это. Итак, когда у вас есть thread=self.refresh_play_top(), python вызовет функцию refresh_play_top, и эта функция что-то вернет — либо None, либо что-то, что не None. Затем этот возвращенный объект передается вашему message.AskQuestion(...). Итак, если self.refresh_play_top() возвращает 5, вы фактически выполняете thread=5. Любая попытка заставить ваш скрипт передавать вам возвращаемое значение функции (с помощью ()) вместо самой функции вызовет больше проблем.

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

self.refresh_play_top() ничего не возвращает. Он просто крутит обложку альбома каждые 33 миллисекунды, в то время как ffplay воспроизводит песню в отдельном задании оболочки. Параметр thread= вызывается, пока пользователь нажимает «Да» или «Нет».
WinEunuuchs2Unix 24.04.2023 23:06

Каждая функция, которая завершается, возвращает что-то, даже если только None. Вызов AskQuestion будет заблокирован до тех пор, пока refresh_play_top не вернется.

chepner 24.04.2023 23:29

@chepner refresh_play_top возвращается через миллисекунду или две, потому что он вызывается в течение 33-миллисекундного (30 кадров в секунду (кадров в секунду)) цикла простоя. thread=None уже является допустимым параметром, поэтому refresh_play_top возвращение None является нарушителем условий сделки. Поэтому я изменил полдюжины команд return, чтобы они возвращали True или False (включая последнюю строку), и теперь все работает.

WinEunuuchs2Unix 25.04.2023 00:37

Другие вопросы по теме