谁能帮助我减少python if语句或其他替代解决方案?

时间:2020-08-02 10:24:34

标签: python python-3.x flask

如果用户以json格式提供输入数据,我正在尝试将详细信息与数据库匹配。我们必须检查密钥,如果密钥存在于数据中(我们拥有),则应该进行一些预处理并返回结果。 我正在创建一个API,该API根据需要返回。

我在这里使用了多个if语句,但是我想减少代码,有什么办法做到这一点?

下面是我的参考代码

@app.route('/api',methods=['GET'])
def aadhar_pan_users_check():
    data=request.get_json()
    aadhar=data.get('aadhar')
    pancard=data.get('pan')
    fname = data.get('firstName')
    lname = data.get('lastName')
    gender = data.get('gender')
    cust_type = data.get('cust_type')
    dob = data.get('dob')

   
    res=[]
    if aadhar!=None and pancard!=None:
        res.append((aadhar_check(aadhar), pan_check(pancard)))
        return str(res)
    elif pancard!=None:
        return str(pan_check(pancard))
    elif aadhar!=None:
        return str(aadhar_check(aadhar))
        # return jsonify({'aadhar': str(aadhar_check(aadhar))})
    elif fname!=None and lname!=None and gender!=None and cust_type!=None and dob!=None and aadhar!=None and pancard!=None:
        ret=[fname,lname,gender,cust_type,dob, aadhar, pancard]
        ret_ty=[formatting_data['fname'],formatting_data['lname'],formatting_data['gen'],formatting_data['client_type'],formatting_data['dob'],formatting_data['aadhar'],formatting_data['pan']]
        # print(ret_ty)
        return (preprocess_user_data(ret,ret_ty),aadhar_check(aadhar),pan_check(pancard))

    elif fname!=None and lname!=None and gender!=None and cust_type!=None:
        ret=[fname,lname,gender,cust_type]

        ret_ty=[formatting_data['fname'],formatting_data['lname'],formatting_data['gen'],formatting_data['client_type']]
        # print(ret_ty)
        return preprocess_user_data(ret,ret_ty),aadhar_check(aadhar)
    elif fname!=None and lname!=None and gender!=None:
        ret=[fname,lname,gender]
        ret_ty=[formatting_data['fname'],formatting_data['lname'],formatting_data['gen']]
        # print(ret_ty)
        return preprocess_user_data(ret,ret_ty)
    elif fname!=None and lname!=None and dob!=None:
        ret=[fname,lname,dob]
        print(1000*'3')
        ret_ty=[formatting_data['fname'],formatting_data['lname'],formatting_data['dob']]
        return preprocess_user_data(ret,ret_ty),aadhar_check(aadhar)
    elif fname!=None and lname!=None:
        ret=[fname,lname]
        ret_ty=[formatting_data['fname'],formatting_data['lname']]
        # print(ret_ty)
        return preprocess_user_data(ret,ret_ty)
    elif fname!=None and lname!=None and cust_type!=None and dob!=None:
        ret=[fname,lname,gender,cust_type,dob] 
        print(1000*'4')
        ret_ty=[formatting_data['fname'],formatting_data['lname'],formatting_data['client_type'],formatting_data['dob']]
        # print(ret_ty)
        return preprocess_user_data(ret,ret_ty),aadhar_check(aadhar)
    elif fname!=None and lname!=None and gender!=None and cust_type!=None:
        ret=[fname,lname,gender,cust_type]
        print(1000*'5')
        ret_ty=[formatting_data['fname'],formatting_data['lname'],formatting_data['gen'],formatting_data['client_type']]
        # print(ret_ty)
        return preprocess_user_data(ret,ret_ty),aadhar_check(aadhar)
    elif fname!=None:
        ret=[fname]
        print(type(fname))
        ret_ty=[formatting_data['fname']]
        # print(ret_ty)
        return preprocess_user_data(ret,ret_ty)
    else:
        return "Something wrong"

我有一些有助于预处理的功能。

1 个答案:

答案 0 :(得分:2)

我尚不清楚您的代码在做什么100%,但是您似乎正在检查aadhar或pancard是否为None-如果它们为None,则返回一些字符串表示形式-然后使用任何其他信息提供了。

使用它,您是否可以循环遍历“额外”数据(如果存在),将其追加到列表中,如果不存在,则不执行任何操作?

然后照常返回preprocess_function。

如下所示:

def aadhar_pan_users_check():
    data=request.get_json()
    aadhar=data.get('aadhar')
    pancard=data.get('pan')

    cust_data = {
        'fname' : data.get('firstName'),
        'lname' : data.get('lastName'),
        'gen' : data.get('gender'),
        'client_type' : data.get('cust_type'),
        'dob' : data.get('dob')
    }

    res = []
          
    ret = []
    ret_ty = []
    for key,value in cust_data.items():
        if value is not None:
            ret.append(value)
            ret_ty.append( formatting_data[key] )  

    if (pan is not None) and (aadhar is not None):
        check_result = 'YOUR_CODE_HERE' # your_code_here
    elif (pan is not None) and (aadhar is None):
        check_result = pan_check(pan)
    elif (pan is None) and (aadhar is not None):
        check_result = aadhar_check(aadhar)
    else:
        check_result = None

    if len(ret) == 0:
        preprocess_result = None
    else:
        preprocess_result = preprocess_user_data(ret,ret_ty)

    return preprocess_result, check_result

我认为函数现在应该这样做:

如果两者都不是None:您需要填写,我不知道您期望什么行为。 如果pan不为None,则aadhar为None:保留'check_pan'函数的结果。 如果aadhar不为None,则pan为None:类似于pan 如果两者都不存在:检查结果保留为None。

如果有可用的客户数据,请重新使用预处理功能。 如果没有客户数据,请保留“无”作为预处理功能的结果。

然后:

返回预处理功能和check_function的结果。

if / else比以前的功能要多,但我认为现在的目的很明确。

我没有任何示例数据可以测试此操作,因此请考虑使用此“伪代码”。

通常应该比较is not None而不是`!= None,例如,请参见What is the difference between " is None " and " ==None "

相关问题