Выполняется ли subprocess.call, даже если функция, в которой он находится, не вызывается - PullRequest
0 голосов
/ 01 февраля 2019

Я просто практикуюсь с приведенным ниже кодом.Когда я запускаю код, кажется, что он запускает функцию супермена, даже когда я ввожу другую клавишу.

Python3 dice.py
Select a number 1-5: 1
__pycache__ fizbuzz.py  q2.py       q4.py
dice.py     q1.py       q3.py       q5.py
I AM BATMAN

он выполняет subprocess.call ('ls', shell = True), даже когда я ввожу 1, что должнотолько запустить функцию Бэтмена.это происходит для каждого входа.Я получаю правильный ответ, но подпроцесс всегда выполняет его?работает подпроцесс, даже если его функция не вызывается?

import subprocess

def batman():
    slogan = "I AM BATMAN"
    return slogan

def superman():
    subprocess.call('ls', shell=True)
    return "Success!"

def dice():
    user_choice = int(input("Select a number 1-5: "))
    outcomes = {
    1: batman(),
    2: superman(),
    3: "Wonder Woman",
    4: "The Flash",
    5: "Green Lantern"
    }
    answer = outcomes.get(user_choice, "Not a valid input")
    return answer
print(dice())

1 Ответ

0 голосов
/ 01 февраля 2019

На самом деле, и супермен и бэтмен получают вызов независимо от того, кто выбран!Чтобы проверить добавьте print('hello') в начале Бэтмена.

Почему?

Ну, как только приложение вводит кубик функции, оно определяет

outcomes = {
1: batman(),   #Function call!
2: superman(), #Function call!
3: "Wonder Woman",
4: "The Flash",
5: "Green Lantern"
}

, как толькокогда мы определяем результаты, мы делаем вызовы функций - при определении 1: мы вызываем batman(), как видно из круглых скобок, то же самое для 2: - функция оценивается (поэтому она запускает ls), и ее результатмагазины ('Success!').Проблема не в подпроцессе, а в дизайне приложения.Опция

  1. Убедитесь, что все функции, используемые здесь, возвращают строки - и тогда строка будет сохранена как результат (или просто потому, что они не имеют нежелательных последствий, однако, зачем вызывать супермена, если он не нужен)?)
  2. Решите, что все результаты являются функциями, и воздержитесь от их вызова.

пример:

def dice():
    user_choice = int(input("Select a number 1-5: "))
    outcomes = {
    1: batman,
    2: superman,
    3: lambda: "With our powers combined,  Captain Planet!"
    }
answer = outcomes.get(user_choice, lambda: "Not a valid input") #Note the default is a function now as well returning the string.
return answer() #Call here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...