Shay
Shay

Reputation: 1499

Generic arguments in recursive functions: terrible habit?

I catch myself doing this a lot. The example is simple, but, in practice, there are a lot of complex assignments to update data structures and conditions under which the second recursion is not called.

I'm working with mesh data. Points, Edges, and Faces are stored in separate dictionaries and "pointers" (dict keys) are heavily used.

import itertools

class Demo(object):
    def __init__(self):
        self.a = {}
        self.b = {}
        self.keygen = itertools.count()

    def add_to_b(self, val):
        new_key = next(self.keygen)
        self.b[new_key] = val
        return new_key

    def recur_method(self, arg, argisval=True):
        a_key = next(self.keygen)
        if argisval is True:
            # arg is a value
            b_key = self.add_to_b(arg)
            self.a[a_key] = b_key
            self.recur_method(b_key, argisval=False)
        else:
            # arg is a key
            self.a[a_key] = arg

demo = Demo()
demo.recur_method(2.2)

Is there a better way? short of cutting up all of my assignment code into seven different methods? Should I be worried about this anyway?

Upvotes: 0

Views: 111

Answers (1)

Marcin
Marcin

Reputation: 49846

Try

def recur_method(self, key=None, val=None):
    if key is None and val is None:
       raise exception("You fail it")

If None is a valid input, then use a guard value:

sentinel = object()
def recur_method(self, key=sentinel, val=sentinel):
    if key is sentinel and val is sentinel:
       raise exception("You fail it")

Upvotes: 1

Related Questions