将两个python与共享相同代码的语句结合使用

时间:2017-06-27 14:26:41

标签: python python-3.5

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打开。

3 个答案:

答案 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:]]() ))