python - 更好的方法吗?

标签 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. 永远不要检查 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. 单个字符串的大小写与字符串列表的大小写真的不同吗?为什么不只使用单元素列表来删除条件?您也可以使用可变参数,使语法更安全:

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

关于python - 更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3569093/

相关文章:

python - 开始使用简单的 pymc3 示例时遇到麻烦

python - 在 Python Pylons 中检测 ajax 与常规浏览器帖子

python - 如何在 Visual Studio Code 中禁用来自 [Python(解析器)] 的即时 linting

python - 关于 TensorFlow 中等级和形状的混淆

python - 用于在数据库中准备的 Scrapy 反向项目排序

python - 无响应的请求 - 了解瓶颈(Flask + Oracle + Gunicorn)

python - 类型错误 :ndarray not callable in scipy. stats.kstest()

python - 从字符串中提取单词以创建特征集 nltk

python - 获取对象的外键父级 - Django

python - 在 TSNE 中选择 random_State 参数(python)