• 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:

    Willingness to look stupid

    People frequently1 think that I'm very stupid. I don't find this surprising, since I don't mind if other people think I'm stupid, which means that I don't adjust my behavior to avoid seeming stupid, which results in people thinking tha…

    via Posts on Dan Luu October 21, 2021

    Experiences in raising children in shared housing

    Sometimes I see posts about people’s hope to raise children in a group housing situation, and it often seems overly optimistic to me. In particular they seem to expect that there will be more shared childcare than I think should be expected. Today I talke…

    via The whole sky October 18, 2021

    EDT with updating double counts

    I recently got confused thinking about the following case: Calculator bet: I am offered the opportunity to bet on a mathematical statement X to which I initially assign 50% probability (perhaps X = 139926 is a quadratic residue modulo 314159). I have acce…

    via The sideways view October 12, 2021

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact