【发布时间】:2021-12-15 03:16:45
【问题描述】:
好吧,冒着因为没有“更努力”而被嘲笑的风险,我有一个场景,我一直在尝试适应 Pythonic 的 switch case 语句。我知道 python 在 3.10 中有新的 match 方法,但在我的 AWS 用例中我仅限于 3.8.10。我一直在阅读其他语言的 switch case,我想找到一种 pythonic 方法将以下混乱的 if/elif/else 语句转换为干净的 switch case。我想知道其他人在这种情况下会做什么
目标:我有一个将被传递到此代码序列中的文件名,我需要返回前三个项目(即transaction_recipient_verification、transaction_account_tokenization 等)。有时代码会收到一个包含“field_results”或“issuers”的文件名,我需要确保修剪后的返回字符串包含相应的大小写。
import random
sampleKeys = [
'transaction_recipient_notification_status_sent/transaction_recipient_notification_status_sent_2021_10_29_12_02_14.snappy',
'transaction_recipient_payment_status_success/transaction_recipient_payment_status_success_2021_10_29_12_02_14.snappy',
'transaction_recipient_verification_rvdm_failure/transaction_recipient_verification_rvdm_failure_2021_10_29_12_02_14.snappy',
'transaction_recipient_verification_rvdm_failure_field_results/transaction_recipient_verification_rvdm_failure_2021_10_29_12_02_14.snappy',
'transaction_recipient_authentication_status_success/transaction_recipient_authentication_status_success_2021_10_29_12_02_14.snappy',
'transaction_recipient_authentication_status_success_field_results/transaction_recipient_authentication_status_success_2021_10_29_12_02_14.snappy',
'transaction_account_tokenization_success/transaction_account_tokenization_success_2021_10_29_12_02_14.snappy',
'transaction_account_tokenization_success_issuers/transaction_account_tokenization_success_2021_10_29_12_02_14.snappy',
'transaction_recipient_payment_status_terminated/transaction_recipient_payment_status_terminated_2021_10_29_12_02_14.snappy',
'transaction_recipient_verification_rvdm_success/transaction_recipient_verification_rvdm_success_2021_10_29_12_02_14.snappy',
'transaction_recipient_verification_rvdm_success_field_results/transaction_recipient_verification_rvdm_success_2021_10_29_12_02_14.snappy',
'transaction_recipient_notification_status_received/transaction_recipient_notification_status_received_2021_10_29_12_02_14.snappy',
'transaction_recipient_authentication_status_success/transaction_recipient_authentication_status_success_2021_10_29_11_17_45.snappy'
]
key = random.choice(sampleKeys)
array_data = any(substring in key for substring in ['_issuers', '_field_results'])
if not array_data:
if 'transaction_recipient_notification' in key:
keySubject = 'transaction_recipient_notification'
elif 'transaction_recipient_authentication' in key:
keySubject = 'transaction_recipient_authentication'
elif 'transaction_recipient_verification' in key:
keySubject = 'transaction_recipient_verification'
elif 'transaction_account_verification' in key:
keySubject = 'transaction_account_verification'
elif 'transaction_account_tokenization' in key:
keySubject = 'transaction_account_tokenization'
elif 'transaction_recipient_payment' in key:
keySubject = 'transaction_recipient_payment'
else:
if '_issuers' in key:
if 'transaction_recipient_notification' in key:
keySubject = 'transaction_recipient_notification_issuers'
elif 'transaction_recipient_authentication' in key:
keySubject = 'transaction_recipient_authentication_issuers'
elif 'transaction_recipient_verification' in key:
keySubject = 'transaction_recipient_verification_issuers'
elif 'transaction_account_verification' in key:
keySubject = 'transaction_account_verification_issuers'
elif 'transaction_account_tokenization' in key:
keySubject = 'transaction_account_tokenization_issuers'
elif 'transaction_recipient_payment' in key:
keySubject = 'transaction_recipient_payment_issuers'
elif '_field_results' in key:
if 'transaction_recipient_notification' in key:
keySubject = 'transaction_recipient_notification_field_results'
elif 'transaction_recipient_authentication' in key:
keySubject = 'transaction_recipient_authentication_field_results'
elif 'transaction_recipient_verification' in key:
keySubject = 'transaction_recipient_verification_field_results'
elif 'transaction_account_verification' in key:
keySubject = 'transaction_account_verification_field_results'
elif 'transaction_account_tokenization' in key:
keySubject = 'transaction_account_tokenization_field_results'
elif 'transaction_recipient_payment' in key:
keySubject = 'transaction_recipient_payment_field_results'
print(f'BEFORE ===> {key}')
print(f'AFTER ===> {keySubject}')
可能的方向:
import re
class MainKeyHandleSwitch:
ARRAY_OPTIONS = ['_issuers', '_field_results']
def __init__(self,key):
self._original_key = key
self._array_data = any(substring in key for substring in self.ARRAY_OPTIONS)
self._trimmed_dict = self.trimmed_dict()
@property
def get_trimmed_dict(self):
return self._trimmed_dict
@property
def get_trimmed_key(self):
return self.__get_key_subject__()
def trimmed_dict(self):
trim_dict = dict()
trim_dict['case_one'] = re.search('transaction_recipient_notification+', self._original_key)
trim_dict['case_two'] = re.search('transaction_recipient_authentication+', self._original_key)
trim_dict['case_three'] = re.search('transaction_recipient_verification+', self._original_key)
trim_dict['case_four'] = re.search('transaction_account_verification+', self._original_key)
trim_dict['case_five'] = re.search('transaction_account_tokenization+', self._original_key)
trim_dict['case_six'] = re.search('transaction_recipient_payment+', self._original_key)
return trim_dict
def __get_key_subject__(self):
obj = next(item for item in list(self._trimmed_dict.values()) if item is not None)
if not self._array_data:
return obj.group(0)
else:
if '_issuers' in self._original_key:
return f'{obj.group(0)}_issuers'
elif '_field_results' in self._original_key:
return f'{obj.group(0)}_field_results'
以及测试类的代码:
import random
key = random.choice(sampleKeys)
print(f'before ===> {key}')
a = MainKeyHandleSwitch(key)
trimmed_key = a.get_trimmed_key
print(f'after ===> {trimmed_key}')
【问题讨论】:
-
一种方法是使用字典
-
我添加了描述任务的目标。字典在额外的可能性中得到了一些棘手的 b/c(在其他顶层内)。
标签: python switch-statement conditional-statements