Nano Hash - криптовалюты, майнинг, программирование

Куда завернуть функцию

Для функции-оболочки почему бы не сработать следующий подход:

# 3. DISALLOW EXECUTION IN MAIN
def disallow_main(func):
    if __name__ == '__main__':
        raise RuntimeError("Cannot run from main.")
    return func

@disallow_main
def echo(prompt='-> '):
    _inp = input(prompt)
    print ("ECHO: %s" % _inp)

То есть почему он поднимается до определения функции? Как правильно сконструировать пленку?


  • Поскольку if __name__ == '__main__' истинно, а декорированная функция выполняется до echo? 28.10.2019
  • См. Также: stackoverflow.com/questions/341379/ 28.10.2019
  • Пожалуйста, не принимайте мой ответ. Как отмечается в комментариях, это решает только половину проблемы. Это объясняет, почему проверка происходит не в то время, когда вы ожидаете, но она по-прежнему не проверяет правильность. 28.10.2019

Ответы:


1

Как отмечено в комментариях, это объясняет, почему проверка происходит в то время, когда она есть, но по-прежнему не делает того, что вы хотите. Эта проверка проверяет только, является ли модуль, содержащий disallow_main, __main__ или нет; нет, если код вызова __main__. Вам понадобится более сложная проверка, чтобы сделать именно то, что вам нужно.


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

def disallow_main(func):
    def wrapper(*args):
        if __name__ == '__main__':
            raise RuntimeError("Cannot run from main.")
        else:
            func(*args)

    return wrapper

Обратите внимание, как возвращается wrapper, и он вызывает func после завершения проверки.

28.10.2019
  • Это по-прежнему не работает - проверяется имя модуля, содержащего этот код, не кода, который его вызывает. Я думаю, что вам нужно проверить inspect.currentframe(1).f_globals['__name__'] (это 1, возможно, должно быть выше, чтобы получить правильный фрейм стека). 28.10.2019
  • Это правда; это было небрежно. Я добавлю примечание и попросил, чтобы они не принимали, чтобы я мог удалить его при необходимости. 28.10.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..