“获取”功能的最佳实践

时间:2015-04-30 16:21:48

标签: python python-2.7 python-3.x

我是Python的新手。

假设我有一个包含电源管理状态的字典。 (OK =打开.FAIL =关闭)。

有几种方法可以编写“get”函数:

第一路

is_power_supply_off(dictionary)
  gets the admin state from dictionary.
  returns true if turned off.
  returns false if turned on.

is_power_supply_on(dictionary)
  gets the admin state from dictionary.
  returns true if turned on.
  returns false if turned off.

第二路

is_power_supply_on_or_off(dictionary, on_or_off)
  gets the admin state from dictionary.
  returns true/false based on the received argument

第三种方式

get_power_supply_admin_state(dictionary)
  gets the admin state from dictionary.
  return value.

然后,我可以在调用get函数的函数中询问

if get_power_supply_admin_state() == turned_on/turned_off...

我的问题是:

以上哪项被认为是最佳做法?

如果这三种方式都可以,而且只是风格问题,请告诉我。

第一种方式被视为“代码重复”吗?我问这个是因为我可以将这两个函数组合成一个(通过添加参数,就像我在第二种方式中所做的那样。但是,IMO,第一种方式比第二种方式更具可读性。

如果您能就我指定的方式分享您的想法,我将不胜感激。

提前致谢!

5 个答案:

答案 0 :(得分:2)

我想说最好的方法是只有一个is_power_supply_on函数。然后,要测试它是否已关闭,您可以执行not is_power_supply_on(dictionary)

这甚至可能是一个lambda(假设state是管理状态的关键字)::

is_power_supply_on = lambda mydict: mydict['state'].lower() == 'ok'

第一种方法的问题在于,正如您所说,它浪费了代码。

第二种方法的问题在于,与not相比,您最多可以保存两个字符(如果您对0使用1on_or_off),如果您使用更惯用的方法(例如on=Trueon_or_off="off") you end up using more characters. Further, it results in slower and more complicated code since you need to do an if`test。

第三种方法的问题在于,在大多数情况下,与手动获取dict值相比,您也可能会浪费字符。

答案 1 :(得分:0)

即使这个解决方案不在你的命题中,我认为创建getter的最pythonic方法是使用属性。因为它,您将能够知道电源是打开还是关闭,但是用户将使用此属性,因为它是一个简单的类成员:

@property
def state(self):
    # Here, get whether the power supply is on or off
    # and put it in value
    return value

此外,您可以创建两个类常量PowerSupply.on = TruePowerSupply.off = False,这将使代码更易于理解

答案 2 :(得分:0)

一般的Pythonic风格是不要不必要地重复自己,所以绝对第一种方法似乎毫无意义,因为它实际上令人困惑(你需要注意它是开还是关)

我最喜欢

<html>
        <head>
         <title>The Lord of the Rings</title>
        <style>

        h3.start{color:  #8391E1; background-color:  #black;, border:  1px; font-size:  100px; float: left font-size:  20px; box-shadow:  2px 2px; line-height: 200px;}
        p {color:  #DD8797; font-size:  32px; line-height:  200%; padding:  5px; width:  300; padding:  10px 0 px 0 px 10px; float: left; margin: 0px 0px 0px 0px;  width:  500px; margin:  5px; display: inline; transform:scale(1,1);  behavior: url(ie-css3.htc); :scale(3,1); z-index:100; left: 250px; top: 350px;}}
    p.ex{height:  200px; width:  200px;} 
        p.test{width: 700px; height:  300px;
    border:  1px dashed #000000;
    word-break:  break-all;}
        #image {
        background:url(https://caronedmunds.files.wordpress.com/2008/09/old-paper21.jpg);
        background-repeat: no-repeat;
        padding:15px;
    text-align:  left; behavior: url(ie-css3.htc);}
        #image2{background-size:  500px 700px;}
        #text { position:  relative;color:red;font-size:36px;font-weight:bold;}
        body {background-color:  #87DDA2;}
         </style>
        </head>
        body
         <h3 class="start">Lord of the Rings:  the Fellowship of the Ring</h3>
        <DIV ID="image">
        <div id="image 2">    p The Lord of the Rings the Fellowship of the Rings was a great movie.  When I was younger I
    tried watching it but I wasn't able to get everything that was going on.  Coupled with the fact that I didn't know what the Hobbit was, it was clear, that I didn't understand it.  That said, I'm a lot older now, and, I'm better able to appreciate it, so, let's see why this film is such a good film shall we?       </p>
        </div>
    </div>

而且,如果我正确地读到这个,你可以走得更远。

get_power_supply_admin_state(dictionary)
  gets the admin state from dictionary
  return value

如果它开启,则评估为True,否则评估为False,创建最简单的测试,因为那样你可以运行

power_supply_on(dictionary)
  return the admin state from dictionary == turned on

答案 3 :(得分:0)

将字典存储在课堂中更像是Pythonic:

class PowerSupply(object):
    def __init__(self):
        self.state = {'admin': 'FAIL'}

    def turn_on(self):
        self.state['admin'] = 'OK'

    def is_on(self):
        return self.state['admin'] == 'OK'

(根据需要添加更多方法)

然后你可以像这样使用它:

ps = PowerSupply()
if not ps.is_on():
    # send an alert!

答案 4 :(得分:0)

result = is_power_supply_off(state)
result = is_power_supply_on(state)
result = not is_power_supply_on(state)  # alternatively, two functions are certainly not needed

为了便于阅读,我非常喜欢这种命名。我们只考虑替代方案,而不是函数定义,而是使用函数。

result = is_power_supply_on_or_off(state, True)
    pass
result = is_power_supply_on_or_off(state, False)
    pass
if get_power_supply_admin_state(state):
    pass
if not get_power_supply_admin_state(state):
    pass

所有这些代码都需要TrueFalse在此上下文中的含义图。说实话,不是那么清楚。在许多嵌入式系统中,0意味着真正的价值。如果此函数分析系统命令的输出怎么办? 0(falsy)值是正确状态/执行的指示符。结果,直观的True表示OK并不总是有效。因此,我强烈建议第一个选项 - 精确命名的函数。

显然,你会有某种私人功能,如_get_power_supply_state_value()。这两个函数都会调用它并操纵它的输出。但重点是 - 它将被隐藏在一个模块中,该模块知道考虑电源状态的意义。实现细节和API用户不需要知道它。