How to add more functionality with arguments in this code?

Tags: python
Question!

I have found nice little program for making quick notes in terminal. There is a little lack of functionality- I can't read notes I have made with it and also I cannot clear notes from file where they are stored. I would like to modify this program, so i can run it with arguments to read what I have written there and also clean. I have some idea how to do that, but can't find write place in code to paste my lines. I want to run it with arguments such as: -r -c

original program looks like this:

#!/usr/bin/env python3

import time
import os
import sys

# add the current local time to the entry header
lines = [ time.asctime() + '\n' + '--------------------\n' ]

if len( sys.argv ) > 1:
    lines.append( ' '.join( sys.argv[ 1: ] ) )
    lines[-1] += '\n'
else:
    while 1:
        try:
            line = input()
        except EOFError:
            break

        # get more user input until an empty line
        if len( line ) == 0:
            break
        else:
            lines.append( line + '\n' )


# only write the entry if the user entered something
if len( lines ) > 1:
    memoir_path = os.path.expanduser( '~/.memoir' )

    # prepend a seperator only if the file exists ( there are entries already in there )
    if os.path.exists( memoir_path ):
        lines.insert( 0, '--------------------\n' )

    with open( memoir_path, 'a' ) as f:
        f.writelines( lines )

my code, which I don't know where to paste (if it is correct):

# read memoir file
if str(sys.argv) == ("r"):
    os.system('cat ~/.memoir')

# clear memoir file
if str(sys.argv) == ("c"):
    os.system('> ~/.memoir')

EDIT:

I have made few changes, due to answer, and everything works fine, but I would like to make this code a little simplier. Author of this code added some usles feature for me to run this program with number of random arguments which will be "transformed" into empty lines in note. It seems to not work anyway after my update, so I want to get rid of this feature. I think it starts in line nr 37 look for #here!!! comment

new code looks like this:

#!/usr/bin/env python3

import time
import os
import sys

def help():
    print ("memoir is a minimal cli diary")
    print ("run script with -r argument to read notes")
    print ("run script with -c argument to clear notes file")
    print ("run script with -h argument for help")

# add the current local time to the entry header
lines = [ time.asctime() + '\n' + '------------------------\n' + '\n' ]

if len(sys.argv) >= 2:
    if sys.argv[1] == '-r':
        # read .memoir file
        os.system('cat ~/.memoir')
        print('\n')
        exit(0)

    if sys.argv[1] == '-h':
        # print help
        help()
        exit(0)

    if sys.argv[1] == '-c':
        # clear .memoir file
        os.system('> ~/.memoir')
        exit(0)

    else:
        print("invalid argument, type m -h for help")
        exit(0)

if len(sys.argv) > 1 and len(sys.argv) != 2: #here!!!
    lines.append( ' '.join(sys.argv[ 1: ]))
    lines[-1] += '\n'
else:
    while 1:
        try:
            line = input()
        except EOFError:
            break

        # get more user input until an empty line
        if len( line ) == 0:
            break
        else:
            lines.append( line + '\n' )


# only write the entry if the user entered something
if len( lines ) > 1:
    memoir_path = os.path.expanduser( '~/.memoir' )

    # prepend a seperator only if the file exists ( there are entries already in there )
    if os.path.exists( memoir_path ):
        lines.insert(0, '\n------------------------\n')

    with open( memoir_path, 'a' ) as f:
        f.writelines( lines )

if len(sys.argv) >= 2:
    # clear .memoir file
    if sys.argv[1] == '-c':
        os.system('> ~/.memoir')


Answers

First, sys.argv is an array with the arguments of the command line in it. So you need to test the length of it :

if len(sys.argv) >= 2 :
   #sys.argv[0] is the name of your program
   if sys.argv[1] == '-c' :

Then you can see that the file is written the latest lines :

if len( lines ) > 1:
memoir_path = os.path.expanduser( '~/.memoir' )

# prepend a seperator only if the file exists ( there are entries already in there )
if os.path.exists( memoir_path ):
    lines.insert( 0, '--------------------\n' )

#here the file is opened with 'a' = append mode. 
#If you want to override the content of the file (for your command 'clear'), use 'w' = write mode.
with open( memoir_path, 'a' ) as f:
    f.writelines( lines )

So you can include the 'clear' command at the end. The 'read' command will rather find its place at the beggining of the program.

By : L. Jean


If you are just asking is this a valid metric then the answer is almost, it is a valid pseudometric if only .computeCost is deterministic.

For simplicity i denote f(A) := model.computeCost(A) and d(A, B) := |f(A)-f(B)|

Short proof: d is a L1 applied to an image of some function, thus is a pseudometric itself, and a metric if f is injective (in general, yours is not).

Long(er) proof:

  • d(A,B) >= 0 yes, since |f(A) - f(B)| >= 0
  • d(A,B) = d(B,A) yes, since |f(A) - f(B)| = |f(B) - f(A)|
  • d(A,B) = 0 iff A=B, no, this is why it is pseudometric, since you can have many A != B such that f(A) = f(B)
  • d(A,B) + d(B,C) <= d(A,C), yes, directly from the same inequality for absolute values.

If you are asking will it work for your problem, then the answer is it might, depends on the problem. There is no way to answer this without analysis of your problem and data. As shown above this is a valid pseudometric, thus it will measure something decently behaving from mathematical perspective. Will it work for your particular case is completely different story. The good thing is most of the algorithms which work for metrics will work with pseudometrics as well. The only difference is that you simply "glue together" points which have the same image (f(A)=f(B)), if this is not the issue for your problem - then you can apply this kind of pseudometric in any metric-based reasoning without any problems. In practise, that means that if your f is

computes the sum of squared distances between the input point and the corresponding cluster center

this means that this is actually a distance to closest center (there is no summation involved when you consider a single point). This would mean, that 2 points in two separate clusters are considered identical when they are equally far away from their own clusters centers. Consequently your measure captures "how different are relations of points and their respective clusters". This is a well defined, indirect dissimilarity computation, however you have to be fully aware what is happening before applying it (since it will have specific consequences).

By : lejlot


This video can help you solving your question :)
By: admin