【问题标题】:Python naming conventions for functions that do modify the object or return a modified copy修改对象或返回修改副本的函数的 Python 命名约定
【发布时间】:2011-11-21 12:35:31
【问题描述】:

对于可以返回已修改对象或仅修改实例的函数,Python 中的命名约定是什么。

假设你想实现这两个,你应该如何命名函数?

示例:假设您想要一个 Image 对象的 crop() 函数。我是 Ruby,这很简单,因为如果你返回一个副本,你应该使用 crop(),如果你修改原始实例,你应该使用 crop!()

【问题讨论】:

    标签: python naming-conventions command-query-separation


    【解决方案1】:

    不确定某些 PEP 中是否有精确的指导方针,但看看某些函数/方法在 python 核心中的工作方式,我个人使用动词共轭。例如,灵感来自:

    >>> l = list('hello world')
    >>> l
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
    >>> sorted(l)
    [' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
    >>> l
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
    >>> l.sort()
    >>> l
    [' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
    

    我会将您的函数命名为 crop() [就地修改对象] 和 cropped() [返回修改后的副本]。

    编辑:我不知道 ruby​​,但在 python 中,两者之间的区别纯粹是传统的(函数/方法行为独立于你如何调用它)。

    HTH!

    【讨论】:

      【解决方案2】:

      在标准库中,有像 list.sort()list.reverse() 这样的方法可以修改 list,而像 sorted()reversed() 这样的函数会返回一些新的东西(reversed() 返回一个迭代器而不是而不是一个新的列表)。但如果实例方法比函数更有意义,我不会为了保持这个约定而这样做。

      在 NumPy 中,许多函数和方法都有一个 out 关键字参数,允许您指定输出应该转到现有数组而不是创建新数组。您甚至可以将out 数组设为输入数组之一。

      【讨论】:

        【解决方案3】:

        此 AFAIK 没有“Python 范围”的约定。但是,我从事的一个项目有一个可能对您有用的约定:如果一个函数可以就地修改其参数,它有一个copy kwarg 来确定它是否对其输入的副本进行操作,并且默认为True.

        def crop(x, copy=True):
            if copy:
                x = x.copy()
            _do_inplace_crop(x)
            return x
        

        【讨论】:

          【解决方案4】:

          如果我想在原地修改某些东西,我会写一个方法:

          smth.crop()
          

          如果我希望它返回一个修改过的对象,那么我会使用一个函数:

          crop(smth)
          

          这样你就可以保持函数风格的函数(没有副作用),以及 OOP 风格的方法(有副作用)。

          不过,我也希望 Python 允许在 Ruby 和 Lisp 等函数名称中使用 !? 字符。

          【讨论】:

          • 至于?,谓词有一个通用约定——在函数名开头使用is
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          • 2020-07-31
          • 2012-06-30
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多