如何命名一个函数,该函数将对象“A”和集合“{A,B}”作为参数,然后返回“B”?

时间:2014-04-20 07:38:10

标签: python function naming-conventions naming

以下函数有什么好名字(在Python中实现)?

def a_function(element, a_set):
    if a_set[0] == element:
        return a_set[1]
    if a_set[1] == element:
        return a_set[0]

assert 'A' == a_function('B', ['A', 'B'])

2 个答案:

答案 0 :(得分:3)

我会使用不同的函数名称,不同的参数名称和文档字符串来明确发生了什么,例如:

def get_other(current, both):
    """Return the element from 'both' that is not 'current'."""
    ...

请注意,both表示没有任何啰嗦的对,并且未指定所需的type

您可以使用自己的实现或Joel的;只要函数完成它所说的内容,它的实现方式并不重要(除了性能问题,边缘情况等)。

但是,要使用不可索引的容器(例如setdict的键)而不必明确测试both是什么,我可能会选择:

def get_other(current, both):
    """Return the element from 'both' that is not 'current'."""
    for item in both:
        if item != current:
            return item

确实,如果len(both) > 2,这将只返回其中不等于current的第一项 - 如果这不是所需的行为,您可以添加对此的检查。

答案 1 :(得分:1)

作为jonrsharpe建议的替代方案(我喜欢它,不要误解我),这是一个使用问题标题中提到的集合的单行版本:

>>> def get_other(element, pair):
...   """Get the other element from a pair"""
...   return (set(pair) - set([element])).pop()
... 

这会计算elementpair的集合差异,然后pop是结果集中的随机成员(理想情况下应该是1的大小)。

以下是一些处理不同可迭代数据类型的示例:

>>> get_other('B', {'A', 'B'})
'A'
>>> get_other('B', ['A', 'B'])
'A'
>>> get_other('A', ['A', 'B'])
'B'
>>> get_other('B', {'A': 1, 'B': 2})
'A'
>>> get_other('B', 'AB')
'A'
>>> get_other(5, {1, 5})
1

如果len(pair) > 2element not in pair,您获取的元素未定义,但始终是来自pair的元素:

>>> get_other('B', 'ABC')
'C'
>>> get_other('B', 'ABCDEF')
'E'

最后,如果pair为空或pair == {element},则会引发KeyError

>>> get_other('B', 'B')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in get_other
KeyError: 'pop from an empty set'