我正在编写一个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。
答案 0 :(得分:4)
永远不要检查type(x) == foo
,使用isinstance(x, foo)
- 如果有子类,前者将会中断。
您似乎在维护并行列表。如果顺序很重要,那么使用元组列表可能更有意义,因此self.values.append((name, description))
。如果顺序无关紧要,字典会更好:self.values[name] = description
(假设您不需要重复名称)。
单字母变量是禁忌。
如果你想用字符串或列表调用newO
,将它分成两个函数的缺点是什么?也许(我可能错了)你来自一种具有编译时多态性的语言,其中字符串和列表将以不同方式分派。实际上它们被视为不同的功能,因此在动态语言中你可能会将它们拆分为:
def add(self, name, description):
...
def add_many(self, name_list, description):
for name in name_list:
self.add(name, description)
您可能不知道先前是否有字符串或列表,但我希望情况并非如此。
单个字符串的情况是否与字符串列表的情况完全不同?为什么不使用单元素列表来删除条件?你也可以使用varargs,使语法更加防弹:
def add_names(self, description, *name_list):
for name in name_list:
self.add(name, description)