我想使用其他名称(mem[0])引用列表(mem)的元素(fetch):

mem = [0]
f = open("File.lx", "rb").read()
for b in f: mem += [b]
size = len(mem)

while mem[0] < size:        #using mem[0]
    char = (mem[0]*2)+1
    source = mem[char]
    target = mem[char + 1]

    mem[0] += 1
    mem[target] = mem[source]


我尝试使用with语句:

mem = [0]
f = open("File.lx", "rb").read()
for b in f: mem += [b]
size = len(mem)

with mem[0] as fetch:        #with statement
   while fetch < size:       #using mem[0] as fetch
    char = (fetch*2)+1
    source = mem[char]
    target = mem[char + 1]

    fetch += 1
    mem[target] = mem[source]


但是我得到一个错误:

Traceback (most recent call last):
  File "C:\documents\test.py", line 6, in <module>
    with mem[0] as fetch:
AttributeError: __enter__


我认为这就是方法,因为这是使用文件对象完成的方式:

with open("File.lx", "rb") as file:
    fileBytes = file.read()


我阅读了with语句的docs,并说__exit()____enter()__方法已加载。根据我阅读并从AttributeError理解的内容,我的猜测是序列元素(mem[0])没有__enter()__方法。

最佳答案

正如已经提到的注释,mem[0]是一个文字整数,它没有__enter____exit__来使as关键字起作用,如果您只使用mem[0],它将确实更简单。

但这太简单了,您可以执行的操作(作为练习,实际上并不执行此操作)
扩展int类并添加__enter____exit__,如下所示:

class FancyInt(int):
    def __enter__(self):
        return self
    def __exit__(self, *args):
        pass

mem = [FancyInt(0)]
with mem[0] as fetch:
    print(fetch)


这很简洁,但是fetch是LITERAL的别名!如果更改fetchmem[0]不会更改!

关于python - 用`with`语句命名列表元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54783074/

10-10 14:35