如何让用户调用函数

时间:2017-04-23 00:02:33

标签: python

我们说我有拦截功能,Bobby,Jimmy和Tom。我希望用户键入"运行拦截"

名称是个人资料

我是python的新手,所以我接近这个的方式只是

<rule enabled="true" match-type="regex">
<name>Enabling CORS Headers</name>
<from>^/path/someMorePath.*$</from>
<condition name="origin" operator="equal">([a-z]+)</condition>
<set type="response-header" name="Access-Control-Allow-Origin">%1</set>
<set type="response-header" name="Access-Control-Allow-Credentials">true</set>

问题是如果用户键入&#34;运行拦截&#34;它不会运行拦截功能,因为用户输入是一个字符串。

我也不能使用if语句

input()

因为如果用户写了#34;运行jimmy&#34;我需要它来运行。我可以使用elif语句

userInput = input()
if userInput == "intercept":
    intercept()

但重点是,如果没有任何名称的个人资料,他们将创建一个新的个人资料并自动添加另一个功能。这不会起作用,因为每次添加新的个人资料时我都必须手动添加一个elif语句

我需要一种让程序理解输入正在寻找函数,搜索函数列表并运行正确函数的方法。

Idk由于缺乏经验而听起来有多原始或白痴,但如果有人能帮助我,我将非常感激

2 个答案:

答案 0 :(得分:1)

直接调用未知用户输入是非常危险的。 允许的函数名称可以作为键放在指向实际函数的字典中:

def intercept():
    print("Function intercept.")

user_functions = dict(
    intercept=intercept,
    # ...
)

user_input = input("Input function name: ")  # Python 3, raw_input for Python 2

if user_input in user_functions:
    user_functions[user_input]()
else:
    print("Error: Unknown function.")

结果:

$ python3 test.py
Input function name: intercept
Function intercept.

$ python3 test.py
Input function name: foobar
Error: Unknown function.

也可以动态创建函数,例如:

def intercept():
    print("Function intercept.")

def jimmy():
    print("Function Jimmy.")

user_functions = {
    'intercept': intercept,
    # ...
}

def create_new_profile(name):
    print("Creating profile for " + name)
    def profile_function():
        print("Profile " + name)

    user_functions[name] = profile_function


while 1:
    user_input = input("Input function name: ")

    if user_input in user_functions:
        user_functions[user_input]()
    else:
        create_new_profile(user_input)

    print()

结果:

$ python3 test.py
Input function name: intercept
Function intercept.

Input function name: Jimmy
Creating profile for Jimmy

Input function name: Alice
Creating profile for Alice

Input function name: Alice
Profile Alice

Input function name: Bob
Creating profile for Bob

Input function name: Bob
Profile Bob

Input function name: Alice
Profile Alice

我不知道,“个人资料功能”应该做什么。也许,数据驱动的方法可能会更好。字典将用户名映射到用户数据。如果用户输入名称不在配置文件字典中,则调用函数create_new_profile以添加新用户。以下示例将用户数据实现为类,包括运行的函数。

class UserProfile:
    def __init__(self, name):
        self.name = name

    def run(self):
        print("User: " + self.name)


def intercept():
    print("Function intercept.")

user_profiles = {
    'Jimmy' : UserProfile('Jimmy'),
}

def create_new_profile(name):
    print("Creating new profile for " + name)
    user_profiles[name] = UserProfile(name)

user_functions = {
    'intercept': intercept,
    # ...
}

while 1:
    user_input = input("Input function name: ")

    if user_input in user_functions:
        user_functions[user_input]()
    elif user_input in user_profiles:
        user_profiles[user_input].run()
    else:
        create_new_profile(user_input)

    print()
$ python3 test.py
Input function name: intercept
Function intercept.

Input function name: Jimmy
User: Jimmy

Input function name: Alice
Creating new profile for Alice

Input function name: Alice
User: Alice

答案 1 :(得分:0)

我对此提出建议......但您可以使用eval。这是使用python2.7python3.x您可以使用input而不是raw_input

def apple():
    print('Mmm apples.')


def banana():
    print('Oh, a banana.')


user_input = raw_input()
eval(user_input + '()')

结果:

python run_options.py
banana
Oh, a banana.

python run_options.py
apple
Mmm apples.