Python 代码跳过IF语句,直接转到ELSE语句

Python 代码跳过IF语句,直接转到ELSE语句,python,Python,//IF语句被完全跳过,但是当我删除ELSE语句时,IF语句可以工作吗 if fname != '' and lname != '' and user != '' and rank != '' and password != '' and firenum != '' and phonenum != '' and phoneconfirm != '' and admin != '': if phonenum == phoneconfirm and len(phonenum) == i

//IF语句被完全跳过,但是当我删除ELSE语句时,IF语句可以工作吗

if fname != '' and lname != '' and user != '' and rank != '' and password != 
'' and  firenum != '' and phonenum != '' and phoneconfirm != '' and admin != 
'':
    if phonenum == phoneconfirm and len(phonenum) == int(10):
        get = AllPersonnel.query.filter_by(agencyid=current_user.agencyid).all()
        for i in get:
            if phonenum == i.phonenum:
                all = []
                all.append({'error' : 'ERROR: Phone number already exists in database'})
                return jsonify(all)
            else:
                pers = AllPersonnel(name.upper(), rank.upper(), firenum, phonenum, username, password, admin.upper(), agencyid, agencyname.upper(), availability, avtimestamp, enat, enattimestamp, taskavailbility, avtimetsamptask, plusdate)
                db.session.add(pers)
                db.session.commit()
                all = []
                all.append({'success' : 'SUCCESS: FireFighter added to database!'})
                return jsonify(all)
这是我的其他代码,适用于我的其他程序

        phoneemp = EmsaEmp.query.all()
        for num in phoneemp:
            if phonenum == num.phonenum:
                allexist = ('ERROR: Phone Number Already Exists In Database. Please Use The Help Desk or Contact a Supervisor. Thanks')
                return render_template('register.html', allexist=allexist)
            else:
                print('Success')
                ans = ''
                name = (fname + ' ' + lname)
                emp = EmsaEmp(name.upper(), title.upper(), phonenum, ans)
                db.session.add(emp)
                db.session.commit()
这就是我最后所做的,它现在起作用了

if phonenum == phoneconfirm and len(phonenum) == int(10):
        get = AllPersonnel.query.filter_by(agencyid=current_user.agencyid).all()
        for i in get:
            if phonenum == i.phonenum:
                all = []
                all.append({'error' : 'ERROR: Phone number already exists in database'})
                return jsonify(all)
        for u in get:
            if phonenum != i.phonenum:
                pers = AllPersonnel(name.upper(), rank.upper(), firenum, phonenum, username, password, admin.upper(), agencyid, agencyname.upper(), availability, avtimestamp, enat, enattimestamp, taskavailbility, avtimetsamptask, plusdate)
                db.session.add(pers)
                db.session.commit()
                all = []
                all.append({'success' : 'SUCCESS: FireFighter added to database!'})
                return jsonify(all)
你陷入了困境

因此,在第一个元素上,您将获得
else
,然后
返回
,并且永远不会执行后续元素

如果删除else,您将使您的算法有机会执行后续的
If
语句

我得说你的算法没有做你想做的;-)


此外,如果很大,请将其替换为

if all((fname, lname, user, rank, password, firenum, phonenum, phoneconfirm, admin)):
更多信息请点击此处:

而且不需要执行
len(phonenum)==int(10)
。只要
len(phonenum)==10就足够了(Python至少和其他语言一样简单,但并不简单)

另一个问题:

            all = []
            all.append({'error' : 'ERROR: Phone number already exists in database'})
            return jsonify(all)
这可以改写为:

            return jsonify([{'error' : 'ERROR: Phone number already exists in database'}])
这样你就不会再创建一个临时变量了(这不是这三行的唯一问题,但我就到此为止)

大编辑: 请尝试以下代码:

import collections

PersonnelData = collections.namedtuple('PersonnelData', [
  'fname', 'lname', 'user', 'rank', 'password', 
  'firenum', 'phonenum', 'phoneconfirm', 'admin',
])

@app.route('/addpersonnellist', methods=['GET', 'POST'])
def addpersonnellist():
    data = PersonnelData(
        fname=request.args.get('fname'),
        lname=request.args.get('lname'),
        username=request.args.get('user'),
        rank=request.args.get('rank'),
        password=request.args.get('password'),
        firenum=request.args.get('firenumone'),
        phonenum=request.args.get('phonenum'),
        phoneconfirm=request.args.get('phonenumconfirm'),
        admin=request.args.get('admin'),
    )
    name = '{data.fname} {data.lname}'.format(data=data)
    if all(data):
        if phonenum == phoneconfirm and len(phonenum) == 10:
            personnel_phonenum = AllPersonnel.objects.values_list('phonenum', flat=True)
            if data.phonenum in personnel_phonenum:
                response = 'ERROR: Phone number already exists in database'
            else:
                pers = AllPersonnel(
                    name.upper(), data.rank.upper(), data.firenum, data.phonenum,
                    data.username, data.password, data.admin.upper(),
                    current_user.agencyid, current_user.agencyname.upper(),
                    '', '', '', '', '', '', '',
                )
                db.session.add(pers)
                db.session.commit()  # Can you do a commit when you're not in a transaction???
                response = 'SUCCESS: FireFighter added to database!'
        else:
            response = 'ERROR: Phone numbers do not match and/or format is invalid.'
    else:
        response = 'ERROR: Not all fields filled out correctly!'
    return jsonify({'response' : response})
正如您所注意到的,没有for循环。尝试使用实际的API。花点时间阅读文档。这不是浪费时间

选中此项:

单一
返回
方式的另一种选择是使用保护条款:

你陷入了困境

因此,在第一个元素上,您将获得
else
,然后
返回
,并且永远不会执行后续元素

如果删除else,您将使您的算法有机会执行后续的
If
语句

我得说你的算法没有做你想做的;-)


此外,如果
很大,请将其替换为

if all((fname, lname, user, rank, password, firenum, phonenum, phoneconfirm, admin)):
更多信息请点击此处:

而且不需要执行
len(phonenum)==int(10)
。只要
len(phonenum)==10就足够了(Python至少和其他语言一样简单,但并不简单)

另一个问题:

            all = []
            all.append({'error' : 'ERROR: Phone number already exists in database'})
            return jsonify(all)
这可以改写为:

            return jsonify([{'error' : 'ERROR: Phone number already exists in database'}])
这样你就不会再创建一个临时变量了(这不是这三行的唯一问题,但我就到此为止)

大编辑: 请尝试以下代码:

import collections

PersonnelData = collections.namedtuple('PersonnelData', [
  'fname', 'lname', 'user', 'rank', 'password', 
  'firenum', 'phonenum', 'phoneconfirm', 'admin',
])

@app.route('/addpersonnellist', methods=['GET', 'POST'])
def addpersonnellist():
    data = PersonnelData(
        fname=request.args.get('fname'),
        lname=request.args.get('lname'),
        username=request.args.get('user'),
        rank=request.args.get('rank'),
        password=request.args.get('password'),
        firenum=request.args.get('firenumone'),
        phonenum=request.args.get('phonenum'),
        phoneconfirm=request.args.get('phonenumconfirm'),
        admin=request.args.get('admin'),
    )
    name = '{data.fname} {data.lname}'.format(data=data)
    if all(data):
        if phonenum == phoneconfirm and len(phonenum) == 10:
            personnel_phonenum = AllPersonnel.objects.values_list('phonenum', flat=True)
            if data.phonenum in personnel_phonenum:
                response = 'ERROR: Phone number already exists in database'
            else:
                pers = AllPersonnel(
                    name.upper(), data.rank.upper(), data.firenum, data.phonenum,
                    data.username, data.password, data.admin.upper(),
                    current_user.agencyid, current_user.agencyname.upper(),
                    '', '', '', '', '', '', '',
                )
                db.session.add(pers)
                db.session.commit()  # Can you do a commit when you're not in a transaction???
                response = 'SUCCESS: FireFighter added to database!'
        else:
            response = 'ERROR: Phone numbers do not match and/or format is invalid.'
    else:
        response = 'ERROR: Not all fields filled out correctly!'
    return jsonify({'response' : response})
正如您所注意到的,没有for循环。尝试使用实际的API。花点时间阅读文档。这不是浪费时间

选中此项:

单一
返回
方式的另一种选择是使用保护条款:



为什么你认为这个条件应该是真的?你的意思是,当代码存在时,它执行else块的内容(即,它附加一个“成功”),当你删除else部分时,它执行if块的内容(即,它附加一个“错误”)?如果他们输入一个已经存在的电话号码,它运行IF语句。如果phonenumber不存在,则运行ELSE语句。同样的代码也适用于我的另一个程序,但由于某种原因,这不适用。是的,弗朗西斯科correct@TreyThomas只需检查下面的答案为什么您认为该条件应该为真?您的意思是,在代码存在的情况下,它执行else块的内容(即,它附加了一个“success”),当您删除else部分时,它执行if块的内容(即,它附加一个“错误”)?如果它们输入一个已经存在的电话号码,它将运行if语句。如果phonenumber不存在,则运行ELSE语句。同样的代码也适用于我的另一个程序,但由于某种原因,这不适用。是的,弗朗西斯科correct@TreyThomas只需检查下面的答案,但我的另一个运行完全相同代码的程序工作得非常完美。或者它不是相同的算法。或者它不在同一个数据集上(电话号码的顺序不同)。如果你想要的在你的另一个程序中排在第一位,那么看起来你的算法是正确的。但仍然不是。实施适当的单元测试,您就会理解错误(我正在指出);-)也许它只是没有任何重复的电话号码,或者重复的号码是名单上的第一个。无论如何,两者都是错误的,正如@Samuel GIFFARD所说的,你应该添加一些测试。此外,用
if
替换你庞大的
if所有((fname,lname,user,rank,password,firenum,phonenum,phoneconfirm,admin)):
。更多信息:@TreyThomas正如我告诉过你的,它与你的其他程序的算法不同。在
else
块中没有
return
语句这突出了另一个问题:DRY,但我的另一个程序运行完全相同的代码,效果非常好。或者它不在同一个数据集上(电话号码的顺序不同)。如果你想要的在你的另一个程序中排在第一位,那么看起来你的算法是正确的。但仍然不是。实施适当的单元测试,您就会理解错误(我正在指出);-)也许它只是没有任何重复的电话号码,或者重复的号码是名单上的第一个。无论如何,两者都是错误的,正如@Samuel GIFFARD所说的,你应该添加一些测试。此外,用
if
替换你庞大的
if所有((fname,lname,user,rank,password,firenum,phonenum,phoneconfirm,admin)):
。更多信息:@TreyThomas正如我告诉过你的,它与你的其他程序的算法不同。在
else
块中没有
return
语句这突出了另一个问题:干燥