java 协程 scala_在没有协程的情况下编写出色的Scala(包括使用yield的Python示例)...

importosimportreimportcodecs## this is the bespoke function I want to port to Scala#defgenerate_all_matching_paths(base_dir_abs_path,rel_ancestor_dir_list,rel_path_matcher):rooted_ancestor_dir_list=[base_dir_abs_path]+rel_ancestor_dir_list

current_dir_abs_path=os.path.join(*rooted_ancestor_dir_list)dir_listing=os.listdir(current_dir_abs_path)forfs_item_nameindir_listing:fs_item_abs_path=os.path.join(current_dir_abs_path,fs_item_name)fs_item_rel_ancestor_list=rel_ancestor_dir_list+[fs_item_name]fs_item_rel_path=os.path.join(*fs_item_rel_ancestor_list)result=rel_path_matcher.match(fs_item_rel_path)ifresult.is_match:yieldfs_item_abs_pathifresult.do_descendandos.path.isdir(fs_item_abs_path):child_ancestor_dir_list=rel_ancestor_dir_list+[fs_item_name]forringenerate_all_matching_paths(base_dir_abs_path,child_ancestor_dir_list,rel_path_matcher):yieldr## all following code is only a context giving example of how generate_all_matching_paths might be used#classMyMatchResult:def__init__(self,is_match,do_descend):self.is_match=is_match

self.do_descend=do_descend# in Scala this should implement the PathMatcher traitclassMyMatcher:def__init__(self,rel_path_regex,abort_dir_descend_regex_list):self.rel_path_regex=rel_path_regex

self.abort_dir_descend_regex_list=abort_dir_descend_regex_listdefmatch(self,path):rel_path_match=self.rel_path_regex.match(path)is_match=rel_path_matchisnotNonedo_descend=Trueforabort_dir_descend_regexinself.abort_dir_descend_regex_list:abort_match=abort_dir_descend_regex.match(path)ifabort_match:do_descend=Falsebreakr=MyMatchResult(is_match,do_descend)returnrdefleading_whitespace(file_path):b_leading_spaces=Falseb_leading_tabs=Falsewithcodecs.open(file_path,"r","utf-8")asf:forlineinf:forcinline:ifc=='\t':b_leading_tabs=Trueelifc==' ':b_leading_spaces=Trueelse:breakifb_leading_tabsandb_leading_spaces:breakreturnb_leading_spaces,b_leading_tabsdefprint_paths(path_list):forpathinpath_list:print(path)defmain():leading_spaces_file_path_list=[]leading_tabs_file_path_list=[]leading_mixed_file_path_list=[]leading_none_file_path_list=[]base_dir_abs_path=r'd:\Projects'rel_path_regex=re.compile('.*json$')abort_dir_descend_regex_list=[re.compile('^.*python_portable.*$')]rel_patch_matcher=MyMatcher(rel_path_regex,abort_dir_descend_regex_list)ancestor_dir_list=[]forfs_item_pathingenerate_all_matching_paths(base_dir_abs_path,ancestor_dir_list,rel_patch_matcher):ifos.path.isfile(fs_item_path):b_leading_spaces,b_leading_tabs=leading_whitespace(fs_item_path)ifb_leading_spacesandb_leading_tabs:leading_mixed_file_path_list.append(fs_item_path)elifb_leading_spaces:leading_spaces_file_path_list.append(fs_item_path)elifb_leading_tabs:leading_tabs_file_path_list.append(fs_item_path)else:leading_none_file_path_list.append(fs_item_path)print('space indentation:')print_paths(leading_spaces_file_path_list)print('tab indentation:')print_paths(leading_tabs_file_path_list)print('mixed indentation:')print_paths(leading_mixed_file_path_list)print('no indentation:')print_paths(leading_none_file_path_list)print('space: {}'.format(len(leading_spaces_file_path_list)))print('tab: {}'.format(len(leading_tabs_file_path_list)))print('mixed: {}'.format(len(leading_mixed_file_path_list)))print('none: {}'.format(len(leading_none_file_path_list)))if__name__=='__main__':main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值