[Tutor] text processing lines variable content

Peter Otten __peter__ at web.de
Thu Feb 7 12:06:39 EST 2019


ingo janssen wrote:

> 
> 
> On 07/02/2019 11:08, Peter Otten wrote:
>> replace the sequence of tests with dictionary lookups
> 
> updated the gist a few times, now I could pre calculate the slices to be
> taken per line, but will there be much gain compared to the copping from
> the left side of the list?

Sorry, I don't understand the question.


Looking at your code

>         if action == "%i":
>             lbl = function[action](content[action])

you really do not need the function[action] lookup here because you know 
that the result will always be f_number. Likewise you could bind 
content["%i"] to a name, labels, say, and then write

if action == "%s":
    lbl = f_number(labels)

which I find much more readable. 

A lookup table only makes sense if provides all necessary information. I 
tried to apply the idea to one of your gist versions:

def set_lbl(items):
    global lbl
    lbl = f_number(items)

def set_w(items):
    global v
    v = f_number(items)

def set_f(items):
    global f
    f = f_number(items)

def set_mx(items):
    global mx
    mx = mx_value_array(items, f)

function = {
    "%i" : set_lbl,
    "%w" : set_w,
    "%s" : set_f,
    "%a" : set_mx,
    "%q" : f_vector,
    "%r" : f_value,
    "%p" : lambda items: f_vector_array(items, v),
    "%P" : lambda items: f_vector_array(items, v),
    "%o" : lambda items: f_value_array(items, v),
    "%m" : f_value,
    "%g" : f_number,
    "%E" : f_value,
    "%e" : lambda items: f_value_array(items, f),
    "%F" : f_value,
    "%A" : lambda items: f_value_array(items, mx + 1),
    "%f" : lambda items: f_value_array(items, f),
    "%t" : lambda items: f_nested_value_array(items, f),
    "%l" : lambda items: f_vector_array(items, f),
    "%n" : lambda items: f_value_array(items, f),
    "%v" : f_value,
    "%c" : f_vector,
    "%C" : f_vector
} 

order = "%i %q %r %w %p %P %o %m %g %E %s %e %F %a %A %f %t %l %n %v %c %C"
order = re.findall("%[a-z]",order,re.M|re.I)
content = {}

actions = []

for i in order:
    items = content[i] = []
    actions.append(partial(function[i], items))

for points, line in enumerate(open("vorodat.txt.vol",'r'), 1):
    line = line.strip()
    line = line.split(" ")
    for action in actions:
        action()

However, while the loop is rather clean now the rest of the code is 
sprinkled with implicit arguments and thus much worse than what you have.



More information about the Tutor mailing list