Skip to content

Instantly share code, notes, and snippets.

@yhaskell
Created March 1, 2017 15:15
Show Gist options
  • Save yhaskell/88b80d0a4a7701db252c4c51195ed2f1 to your computer and use it in GitHub Desktop.
Save yhaskell/88b80d0a4a7701db252c4c51195ed2f1 to your computer and use it in GitHub Desktop.
adds-edits-list.py
import sys
class InvIn(ValueError): pass
def main():
filename = get_string("Choose filename", name = "filename", default = "test")
flagNS = False
Editing = False
TheSet = set()
User = None
MakeOrFind(filename)
while(True):
User = get_string("{0} {1} [Q]uit".format(lambda Editing: "[A]dd, [D]elete" if Editing == True else "", lambda flagNS : "[S]ave" if flagNS == True else ""),
name = "entity", default = "a" if Editing ==True else None).lower()
if Editing == True:
if User == "a":
AddNote(get_string("Add an item:"))
WriteAll()
flagNS = True
if User == "d":
RemNote(get_integer("position of removing? 0 to cancel:"))
WriteAll()
flagNS = True
if User == "s":
Saving()
flagNS = False
break
if User == "q" and flagNS == True:
answer = get_string("save changes? y/n", name = "answer", defailt = "y")
if answer = "y":
Saving()
Quit()
print("wrong command")
#code else -- "invalid entity"
def MakeOrFind(filename):
try:
#makes or finds files
stream = open(filename.lst , 'a')
Editing = True
except: InvIn
"sorry, start again"
def MakeASet(): #done
#makes the set TheSet
TheSet = set(stream.read().split())
def AddNote(addname):
#just add the note done
TheSet.add(addname)
def RemNote(number):
#remove from file and sort done
if number ! = 0:
try:
deleted = sorted(TheSet)[number-1]
TheSet.remove(deleted)
except: KeyError:
print("wrong number")
def Saving():
#saves when S pressed done
filename.write( " ".join(TheSet)
print( "Saved {0} item{s} in {1}.lst".format(len(TheSet), filename, s = "" if len(TheSet) = 1 else "s" )
def Quit():
#quitting done
sys.exit(0)
def WriteAll():
#takes a set, sorts it and writes it with numbers done
if len(TheSet) == 0: print("{0}no elements{0}".format("----------")
pos = 1
for item in sorted(TheSet):
print( "{0}: {1}".format( pos , item))
pos += 1
# additional functions, they are OK
def get_string(message, name="string", default=None,
minimum_length=0, maximum_length=80):
message += ": " if default is None else " [{0}]: ".format(default)
while True:
try:
line = input(message)
if not line:
if default is not None:
return default
if minimum_length == 0:
return ""
else:
raise ValueError("{0} may not be empty".format(
name))
if not (minimum_length <= len(line) <= maximum_length):
raise ValueError("{0} must have at least {1} and "
"at most {2} characters".format(
name, minimum_length, maximum_length))
return line
except ValueError as err:
print("ERROR", err)
def get_integer(message, name="integer", default=None, minimum=0,
maximum=100, allow_zero=True):
class RangeError(Exception): pass
message += ": " if default is None else " [{0}]: ".format(default)
while True:
try:
line = input(message)
if not line and default is not None:
return default
i = int(line)
if i == 0:
if allow_zero:
return i
else:
raise RangeError("{0} may not be 0".format(name))
if not (minimum <= i <= maximum):
raise RangeError("{0} must be between {1} and {2} "
"inclusive{3}".format(name, minimum, maximum,
(" (or 0)" if allow_zero else "")))
return i
except RangeError as err:
print("ERROR", err)
except ValueError as err:
print("ERROR {0} must be an integer".format(name))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment