繁体   English   中英

在Python中的函数内部调用时,函数可以定义实例变量吗?

[英]Can a function define instance variables when called inside a function in Python?

我有一个烧瓶应用程序,该应用程序具有很多重复零件的功能。 为了简化代码,我想调用一个辅助函数,而不是重复代码,包括变量定义。

@app.route('/update_report', methods=["POST"])
def update_report():
    m_log_no = request.form.get('log_no')
    m_ip_address = request.form.get('ip_address')
    m_report_reason = request.form.get('report_reason')
    m_status_code = request.form.get('status_code')
    ...
@app.route('/delete_report', methods=["POST"])
def delete_report():
    m_log_no = request.form.get('log_no')
    m_user_id= request.form.get('user_id')
    ...

我有数百个这样的功能。 我想通过使用一个辅助函数来定义实例变量来简化它:

def helper_function(*args)
    for arg in args:
        # Work some magic of sorts:
        # super.m_arg = request.form.get(arg)

@app.route('/update_report', methods=["POST"])
def update_report():
    parameter_list = ('log_no', 'ip_address', 'report_reason', 'status_code')
    helper_function(*parameter_list)

这种动作可能吗?

只要满足您的需求,您就可以在这些方面做一些事情。

class FormData(object):

    # Using __init__ as per bruno's comment
    def __init__(self, parameters_list, data_object, *args, **kwargs):
        for form_key_item in parameters_list:
            setattr(self, "m_{key_name}".format(key_name=form_key_item), data_object.get(form_key_item))


    # Custom method
    def set_args(self, parameters_list, data_object):
        for form_key_item in parameters_list:
            setattr(self, "m_{key_name}".format(key_name=form_key_item), data_object.get(form_key_item))

并像这样使用

def some_method():
    # While using the custom method for setting values
    # Create your data instance
    your_data_object = FormData()
    # Set the value for the attributes on instance
    your_data_object.set_args(parameters_list, request.form)

    # While using the __init__ method
    your_data_object = FormData(parameters_list, request.form)

    # Use it like
    print(your_data_object.m_log_no)

PS:这是草稿,您可以使用。

一种方法是将request到辅助函数。 从辅助函数返回包含参数和表单值的字典。

这是此概念的演示:

app.py

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

def helper_function(flask_request, args):
    data = {}
    for arg in args:
        data[arg] = flask_request.form.get(arg)
    return data

@app.route('/update_report', methods=["POST"])
def update_report():
    parameter_list = ('log_no', 'ip_address')
    data = helper_function(request, parameter_list)
    return jsonify(data)

@app.route('/delete_report', methods=["POST"])
def delete_report():
    parameter_list = ('log_no', 'user_id')
    data = helper_function(request, parameter_list)
    return jsonify(data)


@app.route('/', methods=["GET"])
def view_reports():
    return render_template("form.html")

if __name__ == '__main__':
    app.run(debug=True)

form.html

<html>
    <head>
        <title>Form</title>     
    </head>
    <body>
        <h3>Update report</h3>
        <form action="/update_report" method="post">
            Log No: <input name="log_no" /> <br>
            IP Address: <input name="ip_address" /> <br>
            <input type="submit" value="Update" />
        </form>             
        <hr>
        <h3>Delete report</h3>
        <form action="/delete_report" method="post">
            Log No: <input name="log_no" /> <br>
            User ID: <input name="user_id" /> <br>
            <input type="submit" value="Delete" />
        </form>             
    </body>
</html>

输出:

  • 图1:调用更新或删除路由之前的表单视图 表格检视

  • 图2:调用更新路由后的响应 output_from_helper

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM