第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

用Python方式僅在一個(gè)函數(shù)中重用代碼的方法

用Python方式僅在一個(gè)函數(shù)中重用代碼的方法

慕容3067478 2021-03-14 16:13:17
我的問題是組織一個(gè)函數(shù)中多次需要的代碼,而沒有其他地方。假設(shè)以下用例:class A(object):    def __init__(self, base):        self.base = base    def foo(self):        result = self.base + 2    # Should go to an extra function.        result = result * 4        if result > 10:            result = result + 2   # Should go to an extra function.        return result    def bar(self):        pass有一個(gè)在一個(gè)重復(fù)foo()與x + 2部分,這在我的項(xiàng)目是20行代碼(將值添加到另一個(gè)對(duì)象的20個(gè)屬性)應(yīng)該被抽象。但是這些放在哪里呢?我看到三種方法來做到這一點(diǎn):(1.)嵌套函數(shù):class A(object):    # ...    def foo(self):        def plus_two(value):            return value + 2        result = plus_two(self.base)        result = result * 4        if result > 10:            result = plus_two(result)        return result    # ...這似乎是有道理的,因?yàn)樗且粋€(gè)非常特定的用例,僅與方法內(nèi)部發(fā)生的事情有關(guān)。但是:無法測試,不能從外部訪問嵌套函數(shù)進(jìn)行單元測試。我真的不想對(duì)此進(jìn)行測試作為一部分的foo(),因?yàn)檫@需要測試所有的plus_two兩倍(因?yàn)槿绻@兩種情況下)。在單元測試中,它應(yīng)該是可以測試plus_two分開,只有其正確調(diào)用在foo()。(2.)輔助方法:class A(object):    # ...    def foo(self):        result = self.plus_two(self.base)        result = result * 4        if result > 10:            result = self.plus_two(result)        return result    def plus_two(self, value):        return value + 2    # ...但是:該方法已經(jīng)并且永遠(yuǎn)不會(huì)被該類中的任何其他方法使用,也不需要訪問self,因此它不應(yīng)成為該類的方法。在不需要訪問對(duì)象或不需要作為接口一部分覆蓋的類中收集函數(shù)不是pythonic。(3.)一個(gè)模塊功能:def plus_two(value):    return value + 2class A(object):    # ...    def foo(self):        result = plus_two(self.base)        result = result * 4        if result > 10:            result = plus_two(result)        return result    # ...但是:這導(dǎo)致一些輔助函數(shù)從其非常特定的上下文中刪除,換句話說,沒有遵循封裝。雖然這似乎不是問題,可能似乎是解決方案,但在我的項(xiàng)目中,這確實(shí)會(huì)使整個(gè)模塊變得混亂,因?yàn)樵摴δ芡ǔEc該模塊無關(guān),但正如上面所說的,非常具體換句話說:將其拆分到與其上下文相距甚遠(yuǎn)的某個(gè)位置,這會(huì)使代碼的可讀性和python的可讀性大大降低。還有其他方法,還是應(yīng)該從此處顯示的三種方法中選擇一種?
查看完整描述

2 回答

?
浮云間

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊

我肯定希望真實(shí)的例子更加復(fù)雜:)

我會(huì)說去嵌套或輔助功能。我個(gè)人會(huì)去使用輔助函數(shù),但這只是我的意見。當(dāng)然,這是我可以告訴您的描述。實(shí)際代碼將為建議提供更好的依據(jù),而不僅僅是一個(gè)隨機(jī)示例。


查看完整回答
反對(duì) 回復(fù) 2021-03-30
?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊

我個(gè)人認(rèn)為選項(xiàng)1或2是最干凈的。如您所提到的,選項(xiàng)3是非常特定于上下文的,可以定義為模塊功能。

要在選項(xiàng)1或2之間進(jìn)行選擇,您需要確定對(duì)單元代碼進(jìn)行單元測試的重要性??紤]到您已經(jīng)基本回答了單元測試的重要性以及是否可以從foo()進(jìn)行單元測試的問題,

而且我真的不想在foo()中測試它

那么您將需要使用選項(xiàng)2的一些變體。理想情況下,私有方法將是您的理想之選,但是由于python不支持該方法,因此至少應(yīng)考慮為其命名。__plus_two()這是有關(guān)Python中領(lǐng)先的雙下劃線的相關(guān)問題:對(duì)象名稱前的單下劃線和雙下劃線是什么意思?這是另一個(gè)與私有方法有關(guān)的問題:為什么Python的“私有”方法實(shí)際上不是私有的?


查看完整回答
反對(duì) 回復(fù) 2021-03-30
  • 2 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)