-1

I am a new python learner and I was trying to make a simple program as a practice. However, there's a problem. The if statement in this code gets executed even if it is false. I left a comment near the faulty if statement or basically it is at line 25.

I tried to put the if statement in try as an intended block but nothing changed.

Code:

def errormessage(asr, cnum):
    print("Process terminated due to a error.\nError: " + str(asr) + "\nType: " + asr.__class__.__name__ + "\nCodeNum: " + str(cnum))
    quit()


modelist = ("r", "w", "a")

fname = input("Enter file name or directory: ")
fmode = input("Enter file mode (r/w/a): ")
if fmode not in modelist:
    print("Invalid file mode, quitting...")
    quit()
else:
    pass

try:
    if fmode == "r":
        fop = open(fname, fmode)
        print("File content:\n\n" + fop.read())
    elif fmode == "w" or "a":
        pass
except Exception as err:
    errormessage(err, 1)

if fmode == "w" or "a": # FAULTY IF STATEMENT
    try:
        fwriteinp = str(input("What do you want to write/append to the file? (type abort to abort): "))
        if fwriteinp == "abort":
            print("Process aborted.")
            quit()
        else:
            pass
        fwrite = open(fname, fmode)
        fwrite.write(str(fwriteinp))
        fwrite.close()
        print(str(open(fname, "r").read()))
    except Exception as err:
        errormessage(err, 2)
else:
    pass


if fname.endswith(".py"):
    try:
        execopt = input("Do you want to execute the file? (y/n): ")
        try:
            if execopt == "y":
                exec(open(fname).read())
            else:
                print("Quitting...")
                quit()
        except Exception as err:
            errormessage(err, 3)
    except Exception as err:
            errormessage(err, 4)
else:
    quit()

Help is appreciated.

Asudox
  • 11
  • 3

2 Answers2

0
if fmode == "w" or "a":

Always evaluates as True because "a" evaluates as True in a condition

You have to write

if fmode == "w" or fmode == "a":
Maxime
  • 818
  • 6
  • 24
0

if fmode == "w" or "a": is indeed a faulty if statement. Consider this being evaluated as two different expressions.

  1. fmode == "w" # can be false
  2. "a" # always true.

Thus if fmode == "w" or "a": evaluates to if False or True which always evaluates to True

MohitC
  • 4,541
  • 2
  • 34
  • 55