Можно ли сделать контекстно-зависимую функцию? - PullRequest
0 голосов
/ 07 сентября 2018

Я использовал следующий скрипт, чтобы запустить скрипт напрямую и просто сделать командную строку bash для запуска его вне скрипта (например, планировщик заданий).

def qsubcommand(func):
    def wrapper(*args, **kwargs):
        if kwargs.get('test', False):
            cmdl = ' '.join(['this.py', func.__name__, *map(str, args)])
            return cmdl
        else:
            return func(*args, **kwargs)
    return wrapper

@qsubcommand
def calculate(value1, value2):
   # do something

if __name__ == '__main__':
    if len(sys.argv) > 1:
        func, args = sys.argv[1], sys.argv[2:]
        if func in locals().keys():
            locals()[func](*args)
        else:
            raise NotImplementedError

У меня много функций, таких как «вычислить». Я работаю со скриптом для запуска и тестирования программы.

# When I want to run directly:
>>> calculate(4, 5)

# When I want to just print command line:
>>> calculate(4, 5, test=True)
'this.py calculate 4 5'

Однако я хочу использовать его в зависимости от контекста, как показано ниже.

# When I want to run directly:
>>> test = False
>>> calculate(4, 5)

# When I want to just print command line:
>>> test = True
>>> calculate(4, 5)
'this.py calculate 4 5'

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

Спасибо за ваши добрые ответы заранее.

1 Ответ

0 голосов
/ 07 сентября 2018

Просто поместите это в ту часть функции, где вы хотите проверить переменную:

if 'test' in globals() and test:
    # do test
else:
    # do normal

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...