2012-11-26 116 views
0

我讓自己做了很多。這個例子很簡單,但實際上,有很多複雜的分配來更新數據結構和條件,在這種情況下第二次遞歸沒有被調用。遞歸函數中的泛型參數:可怕的習慣?

我正在處理網格數據。點,邊和麪被存儲在單獨的字典中,並且「指針」(字典鍵)被大量使用。

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) 

有沒有更好的方法?把我的任務代碼分成七種不同的方法?無論如何,我是否應該擔心這一點?

+0

不知道你的問題是什麼,我沒有看到'* args'可言。 – jdotjdot

+0

以一個簡短的示例縮寫爲單個「arg」。這個問題可能會被更好地表述爲「遞歸函數中的通用參數」。馬辛的建議好得多,似乎很明顯,但我夾帶並可以原諒自己一些錯過的猜測。 – Shay

+0

我看不到問題。特別是,我不明白你爲什麼使用遞歸方法;你可以做'arg = b_key'而不是遞歸調用,然後將'else'部分放下一個縮進級別。 –

回答

1

嘗試

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

如果None是一個有效的輸入,然後使用一個安全值:

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