with.. if else.. as 语句单行python

所以我遇到了一个问题。我试图打开一个文本文件并根据变量的值正常或反向逐行读取它。Python不断抛出AttributeError: __enter__错误;但我主要是想看看这是否可能。


示例代码:


def function(rev):

    #    - open file in reverse format                        - open file normally

    with reversed(list(open("test.txt"))) if rev == True else open("test.txt") as dict:

        for line in dict:

            print (line)

            pass

        pass

    pass


function(True)

结果:


    ...

    with reversed(list(open("test.txt"))) if rev == True else open("test.txt") as dict:

AttributeError: __enter__

我怎样才能做到这一点,而不必为同一过程的两种可能性和 2 个不同的 with-as 循环创建标准 if 语句?


繁星点点滴滴
浏览 131回答 2
2回答

繁华开满天机

不要在with语句中这样做,您的表达式将生成两个不同的对象(列表或文件对象,列表没有上下文管理器接口,文件对象有,这就是引发错误的原因)只需分两行,先打开:def function(rev):    with open("test.txt") as fp:        data = reversed(list(fp)) if rev == True else fp:        for line in data:            print(line)function(True)

Cats萌萌

Python 中的上下文管理器正在发生一些疯狂的事情。尝试改用简单的 for 语句和常规的 for 循环。read_option.pydef my_function(rev):    if rev == True:        read_pattern = reversed(list(open("test.txt").readlines()))    else:        read_pattern = list(open("test.txt"))    for line in read_pattern:        print (line)my_function(True)如果你真的想要一个with语句,你可能需要__enter__在你自己的类中实现该方法。有关更多详细信息,请参阅此答案:Python 错误:AttributeError:__enter__示例 test.txtabcdefghijlk输出(py36) [~]$ python3 read_option.pyijlkefghabcd
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python