我是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,第一种方式比第二种方式更具可读性。
如果您能就我指定的方式分享您的想法,我将不胜感激。
提前致谢!
答案 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
使用1
或on_or_off
),如果您使用更惯用的方法(例如on=True
或on_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 = True
和PowerSupply.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
所有这些代码都需要True
和False
在此上下文中的含义图。说实话,不是那么清楚。在许多嵌入式系统中,0
意味着真正的价值。如果此函数分析系统命令的输出怎么办? 0
(falsy)值是正确状态/执行的指示符。结果,直观的True
表示OK并不总是有效。因此,我强烈建议第一个选项 - 精确命名的函数。
显然,你会有某种私人功能,如_get_power_supply_state_value()
。这两个函数都会调用它并操纵它的输出。但重点是 - 它将被隐藏在一个模块中,该模块知道考虑电源状态的意义。实现细节和API用户不需要知道它。