def test(file_name):
if file_name.lower().endswith('.gz'):
with gzip.open(file_name) as f:
f_csv = csv.reader(i.TextIOWrapper(f))
#### Same Code
if file_name.lower().endswith('.csv'):
with open(file_name) as f:
f_csv = csv.reader(i.TextIOWrapper(f))
#### Same Code
问题>是否有更好的方法来组合上述代码而不重复相同的代码'部分?如果test
是gz文件,则file_name
函数使用gzip.open,否则会以常规open
打开。
答案 0 :(得分:8)
一种方法是:
def test(file_name):
loader = None
if file_name.lower().endswith('.gz'):
loader = gzip.open
elif file_name.lower().endswith('.csv'):
loader = open
if loader is not None:
with loader(file_name) as f:
f_csv = csv.reader(i.TextIOWrapper(f))
#### Same Code
答案 1 :(得分:0)
def test(file_name):
f = None
if file_name.lower().endswith('.gz'):
f = gzip.open(file_name)
if file_name.lower().endswith('.csv'):
f = open(file_name)
if f is not None:
f_csv = csv.reader(i.TextIOWrapper(f))
#### Same Code
f.close()
答案 2 :(得分:0)
如果您关心代码的简洁性,可以这样做:
bool checkType( A *ptr, Type type )
{
switch( type ) {
case typeB: return dynamic_cast<B*>( ptr );
// check for other types here
...
default: throw std::runtime_error( "this type not supported" );
}
}
将您的函数存储在dict中,并通过使用文件扩展名索引来调用正确的函数。请注意,如果您的文件没有扩展名,则会失败。
如果你想确保缺少扩展名不会导致错误,你可以指定一个函数作为默认值(比如 case typeB: return dynamic_cast<B*>( ptr ) != nullptr;
)来处理除gzip之外的所有类型的文件。
def test(file_name):
open_fnc = { '.gz' : gzip.open, '.csv' : open }
f_csv = csv.reader(i.TextIOWrapper(open_fnc[file_name.lower()[-3:]]() ))