即使未调用subprocess.call的函数,它也会运行吗

时间:2019-02-01 16:52:12

标签: python-3.x subprocess

我正在使用以下代码进行练习。当我运行代码时,即使输入另一个键,似乎也可以运行超人功能。

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

即使我输入1,它也会执行subprocess.call('ls',shell = True),它只应运行Batman函数。每次输入都会发生这种情况。我得到正确的答案,但是子流程总是执行该步骤吗?即使未调用子函数,子进程也会运行吗?

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 :(得分:1)

事实上,无论被选为谁, 超人和蝙蝠侠都会被召唤!要检查,请在蝙蝠侠的开头添加一个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.