Может ли кто-нибудь помочь мне в том, как уменьшить операторы python if или любое другое альтернативное решение? - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь сопоставить детали с базой данных, если пользователь вводит данные в формате json. мы должны проверить ключи, если ключи присутствуют в данных (которые у нас есть), он должен выполнить некоторую предварительную обработку и вернуть результаты. Я создаю 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 Ответ

2 голосов
/ 02 августа 2020

Я не на 100% понимаю, что делает ваш код, но похоже, что вы проверяете, являются ли aadhar или pancard None - возвращая некоторое строковое представление, если они None - а затем используя любую дополнительную информацию

Используя это, не могли бы вы просто l oop через «дополнительные» данные, если они есть, добавить их в список, а если нет, ничего не делать?

Затем верните 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 в результате проверки.

Если есть данные клиента, сохраните повторное использование функции предварительной обработки. Если данные о клиенте отсутствуют, оставьте None как результат функции предварительной обработки.

затем:

возвращает результат функции предварительной обработки и check_function.

Есть больше if / else, чем в предыдущей функции, но я думаю, что теперь их цель совершенно ясна.

У меня нет образцов данных, чтобы проверить, что это будет делать, поэтому рассмотрите этот «псевдокод».

Обычно вам следует сравнивать is not None, а не `! = None, см. Например В чем разница между« is None »и« == None »

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...