Skip to main content

plural5.py

import re
import string

def buildRule((pattern, search, replace)):
    return lambda word: re.search(pattern, word) and re.sub(search, replace,   word)

def plural(noun, language='en'):
    lines = file('rules.%s' % language).readlines()
    patterns = map(string.split, lines)
    rules = map(buildRule, patterns)
    for rule in rules:
        result = rule(noun)
        if result: return result

if __name__ == '__main__':
    import sys
    if sys.argv[1:]:
        print plural(sys.argv[1])
    else:
        print __doc__


You're still using the closures technique here (building a function dynamically that uses variables defined
outside the function), but now you've combined the separate match and apply functions into one.


Our plural function now takes an optional second parameter, language, which defaults to en.

You use the language parameter to construct a filename, then open the file and read the contents into a list. If
language is en, then you'll open the rules.en file, read the entire thing, break it up by carriage returns,
and return a list. Each line of the file will be one element in the list.


As you saw, each line in the file really has three values, but they're separated by whitespace (tabs or spaces, it
makes no difference). Mapping the string.split function onto this list will create a new list where each
element is a tuple of three strings. So a line like [sxz]$ $ es will be broken up into the tuple
('[sxz]$', '$', 'es').


If patterns is a list of tuples, then rules will be a list of the functions created dynamically by each call to
buildRule. Calling buildRule(('[sxz]$', '$', 'es')) returns a function that takes a single
parameter, word. When this returned function is called, it will execute re.search('[sxz]$', word)
and re.sub('$', 'es', word).


Because you're now building a combined match−and−apply function, you need to call it differently. Just call
the function, and if it returns something, then that's the plural; if it returns nothing (None), then the rule didn't
match and you need to try another rule.



Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...