更好的方法吗?

时间:2010-08-25 18:32:11

标签: python

我正在编写一个python函数,其中包含以下内容:

class myObj(object):
    def __init__(self, args):
        # there is code here
    def newO(self, name, description):
        if type(name)==str:
            self.oname.append(name)
            self.o.append(description)
        elif type(name)==list:
             for n in name:
                self.oname.append(n)
                self.o.append(description)

然而,我被认为这不是实现这一目标的最佳方法。什么是更好的方式? 我希望能够用字符串或列表调用newO。

1 个答案:

答案 0 :(得分:4)

  1. 永远不要检查type(x) == foo,使用isinstance(x, foo) - 如果有子类,前者将会中断。

  2. 您似乎在维护并行列表。如果顺序很重要,那么使用元组列表可能更有意义,因此self.values.append((name, description))。如果顺序无关紧要,字典会更好:self.values[name] = description(假设您不需要重复名称)。

  3. 单字母变量是禁忌。

  4. 如果你想用字符串或列表调用newO,将它分成两个函数的缺点是什么?也许(我可能错了)你来自一种具有编译时多态性的语言,其中字符串和列表将以不同方式分派。实际上它们被视为不同的功能,因此在动态语言中你可能会将它们拆分为:

    def add(self, name, description):
        ...
    def add_many(self, name_list, description):
        for name in name_list:
            self.add(name, description)
    

    您可能不知道先前是否有字符串或列表,但我希望情况并非如此。

  5. 单个字符串的情况是否与字符串列表的情况完全不同?为什么不使用单元素列表来删除条件?你也可以使用varargs,使语法更加防弹:

    def add_names(self, description, *name_list):
        for name in name_list:
            self.add(name, description)