我在一個專案上看到一段代碼,想知道如何用較少的陳述句寫出一段代碼。
以下是代碼:
if not self.test_done。
phase = "Test"/span>
else:
ifself.need_video and notself.video_sent:
相='Video'
else:
if not self.screening1_made and not self.screening2_made。
相='Screening 1''篩選1'。
else:
if ( self.screening1_made and not self.screening2_made ) or not self.passing:
相='篩選2'。
else:
if not self.passed_phase1:
phase = 'Interview 1'else:
if not self.pass_phase2:
phase = 'Interview 2'else:
if not self.pass_phase3:
phase = 'Interview 3'else:
if not self.got_offer:
相='Waiting offer decision'else:
if self.accepted_offer is None:
相='等待候選人的決定'。
elif self.accepted_offer == "接受":
phase = 'Accepted offer'elif self.accepted_offer == "Declined":
phase = 'Declined offer': 拒絕了。
什么是避免嵌套if陳述句的最佳做法?
uj5u.com熱心網友回復:
你可以把它提取到方法中并提前回傳,你也可以使用字典查詢來獲得你的輸出。
OFFER = {
None。"等待候選人的決定"。
"已接受"。"接受報價"。
"拒絕了"。"Declined offer"。
}
def some_function_name(self)。
if not self.test_done。
return "Test"
if self.need_video and not self.video_sent。
return "Video"
if not self.screening1_made and not self.screening2_made。
回傳 "screening 1"
if (self.screening1_made and not self.screening2_made) or not self.passing:
return "篩選 2"
if not self.passed_phase1:
return " Interview 1"
if not self.pass_phase2:
return " Interview 2"
if not self.pass_phase3:
return "Interview 3"。
if not self.got_offer:
return "Waiting offer decision"
return OFFER.get(self.accept_offer, None)
uj5u.com熱心網友回復:
在我看來,這聞起來像一個狀態機。在評估狀態機時,經常使用 "switch - case "結構,雖然python目前還沒有這個確切的功能(3.10將引入match: case),但是一個elif的串列應該可以解決這個問題。
if not self.test_done。
phase = "Test"
elif self.need_video and not self.video_sent。
相='Video'
elif self.need_video and not self.video_sent。
相='Video'
elif not self.screening1_made and not self.screening2_made。
相='Screening 1''篩選1'。
elif ( self.screening1_made and not self.screening2_made ) or not self.passing:
相='篩選2'。
elif not self.passed_phase1:
phase = '采訪1'
elif not self.passed_phase2:
phase = '采訪2'
elif not self.passed_phase3:
phase = '采訪3'
elif not self.got_offer:
相='Waiting offer decision'elif self.accept_offer is None:
相='等待候選人的決定'。
elif self.accepted_offer == "接受":
phase = 'Accepted offer'elif self.accepted_offer == "Declined":
phase = '拒絕報價
扁平化后,看起來還不錯,如果不改變你跟蹤所有條件的方式,你可能不會找到一個明顯更優雅的解決方案。
uj5u.com熱心網友回復:
你可以使用lambda來運行運算式。在下面的例子中,我們迭代了包含lambda運算式和字串的圖元串列。當我們找到一個為真的lambda運算式時,我們就跳出了回圈。
x = 1
運算式 = [
(lambda: x == 0, 'X is equal to 0'),
(lambda: x == 1, 'X is equal to 1'),
(lambda: x == 2, 'X is equal to 2'),
]
phrase = '沒有找到結果')
for item in expressions:
expression = item[0]
text = item[1]
if expression()。
短語=文本
breakprint(phrase)
這就是結果。
X is等于1。
uj5u.com熱心網友回復:
你應該重構你的程式。 這里有一個粗略的Interview類和相關的物件,其中包括一個事件名稱和輪數的基本字典。
class InterviewEvent。
def __init__(self, event_id, event_name, total_rounds) -> None:
self.event_id。int = event_id
self.event_name: str = event_name.
self.total_rounds: int = total_rounds
self.competed_rounds: int = 0
self.completed: bool = False
class Interview:
""采訪類,用于跟蹤采訪進度。
""
def __init__(self, expected_workflow: dict = None)。)
self.events = []
self.current_event: InterviewEvent = None: self.event = [] self.current_event.
if expected_workflow:
self.__init_events(expected_workflow)
def __init_events(self, wf: dict) -> None:
""從作業流字典中填充事件串列。""。
self.events = [InterviewEvent(i, k, v) for i, (k, v) in enumerate(wf.items() )]
# 設定當前事件
self.current_event = self.events[0]
def completed_event_round(self, title, round_number)。
""更新事件的輪回數。 如果完成,則遞增
到下一輪或作業流中的下一個事件。
""
for event in self.events。
if event.event_name.lower() == title.lower() 。
if event.competed_rounds < round_number:
event.competed_rounds = round_number
# Mark event completed if completed rounds equals total rounds.
if event.competed_rounds == event.total_rounds:
event.completed = True[/span]。
if event.complete:
# 將當前事件增加1。
self.current_event = self.events[event.event_id 1]
def __event_attrs(self, e: InterviewEvent) -> str:
return "
".join([f"{k}: {v}" for k, v in e.__dict__.items()] )
@property
def view_current(self)。
print(self.__event_attrs(self.current_event))
@propertydef remaining_events(self)。
return [e for e in self.events if not e.completed]
@property
def view_remaining_events(self)。
events_remaining = self.remaining_events
if events_remaining:
print("
".join([self.__event_attrs(e) for e in events_remaining])
@property
def event_ids(self)。
""回傳所有當前的事件ID。""。
return [e.event_id for e in self.events]
@property
def event_names(self)。
""回傳所有當前的事件名稱。""。
return [e.event_name for e in self.events]
# 事件名稱和輪數的字典。
workflow_rounds = dict(
Test = 1,
視頻 = 1,
篩選 = 2,
訪談 = 3,
)
查看未完成的事件。
interview.view_remaining_events
輸出:
event_id。0
event_name: 測驗
total_rounds: 1
competed_rounds: 0
完成了。假的。
event_id: 1
event_name: 視頻
total_rounds: 1
competed_rounds: 0
完成了。假的。
event_id: 2
事件名稱: 篩選
total_rounds: 2
競爭的回合數。0
完成了。假的。
event_id: 3
事件名稱:面試
total_rounds: 3
competed_rounds: 0
完成了。假的。
查看當前事件
interview.view_current
輸出:
event_id: 0
event_name: 測驗
total_rounds: 1
competed_rounds: 0
完成了。假的。
標記第一輪測驗為完成
interview.completed_event_round(title = "Test", round_number = 1)
再次,查看未完成的事件。
interview.view_remaining_events
輸出:
event_id。1
event_name: 視頻
total_rounds: 1
competed_rounds: 0
完成了。假的。
event_id: 2
事件名稱: 篩選
total_rounds: 2
競爭的回合數。0
完成了。假的。
event_id: 3
事件名稱:面試
total_rounds: 3
competed_rounds: 0
完成了。假的。
最后,查看當前事件
interview.view_current
輸出:
event_id: 1
event_name: 視頻
total_rounds: 1 event_name: Video total_rounds.
competed_rounds: 0
完成了。假的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/314499.html
標籤:
