• Posts
  • RSS
  • ◂◂RSS
  • Contact

  • Require Keyword Arguments

    July 13th, 2014
    python, tech  [html]
    To avoid errors in calling a python function you might want to ensure it's only ever called with keyword arguments. Say you have:
        def score(actual, predicted):
           ...
    
    and you're worried people accidentally call it with the arguments reversed. After all, nothing looks surprising with:
        score(model.predict(data), isRepaid)
    
    We can have a culture where everyone writes in the keyword arguments, as:
        score(actual=isRepaid, predicted=model.predict(data))
    
    This mostly solves the problem, but could we have Python check this for us? Yes! PEP 3102 added this to Python 3+:
        def score(*, actual, predicted):
          ..
    
    But what about the Python 2 series? You could rebuild Python with this patch applied, or you could use a decorator that verifies there are no positional arguments and then calls the original function:
        def poscheck(f):
          def checked_f(*args, **kwargs):
            if args:
              raise PositionalArgumentsError(f)
            f(**kwargs)
          return checked_f
    
        @poscheck
        def score(actual, predicted):
          ...
    
    This is pretty good, but what about a case like this:
        # Split s on newlines ('\n'), returning a list.  These newlines
        # are not normally retained, but if the optional keepends argument
        # is True then they're kept.
        def splitlines(s, keepends=False):
           ...
    
    If someone calls splitlines as splitlines(s, True) that's going to be pretty confusing to a reader. You'd like to make sure writers always make it clear what the boolean is about, so you have a house style where you write splitlines(s, keepends=True). If you used poscheck, though, that would require splitlines(s=s, keepends=True) which is too verbose. So, use poscheck_except instead:
        @poscheck_except(1)
        def splitlines(s, keepends=False):
          ...
    
    This will require that after the first positional argument all other arguments are given with keywords, if present.

    The code is poscheck on github.

    Comment via: google plus, facebook

    Recent posts on blogs I like:

    How to extend pockets

    Make women's pants pockets big enough to hold a phone properly The post How to extend pockets appeared first on Otherwise.

    via Otherwise May 19, 2022

    Buckingham Palace

    I love England. Especially because of the big castle called Buckingham Palace. I got to see the outside there, but my mom showed me some pictures of the inside. I love it there. But the outside doesn't look very fancy to me. But I never knew why those …

    via Anna Wise's Blog Posts April 25, 2022

    What is causality to an evidential decision theorist?

    (Subsumed by: Timeless Decision Theory, EDT=CDT) People sometimes object to evidential decision theory by saying: “It seems like the distinction between correlation and causation is really important to making good decisions in practice. So how can a theor…

    via The sideways view April 17, 2022

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact