声明长期保留80个字符?

时间:2015-08-14 15:36:55

标签: python with-statement pep8

什么是PEP-8-ify的pythonic方式,例如with statement:

with tempfile.NamedTemporaryFile(prefix='malt_input.conll.', dir=self.working_dir, mode='w', delete=False) as input_file, tempfile.NamedTemporaryFile(prefix='malt_output.conll.', dir=self.working_dir, mode='w', delete=False) as output_file:
    pass

我可以这样做,但由于临时文件i / o不是with语句,它会在with后自动关闭吗?那是pythonic吗?:

intemp = tempfile.NamedTemporaryFile(prefix='malt_input.conll.', dir=self.working_dir, mode='w', delete=False)

outtemp = tempfile.NamedTemporaryFile(prefix='malt_output.conll.', dir=self.working_dir, mode='w', delete=False)

with intemp as input_file,  outtemp as output_file:
    pass

或者我可以使用斜杠:

with tempfile.NamedTemporaryFile(prefix='malt_input.conll.',
dir=self.working_dir, mode='w', delete=False) as input_file, \
tempfile.NamedTemporaryFile(prefix='malt_output.conll.', 
dir=self.working_dir, mode='w', delete=False) as output_file:
    pass

但PEP8是否符合要求?那是pythonic吗?

2 个答案:

答案 0 :(得分:4)

PEP 0008 does say it's ok使用with行的反斜杠。

  

反斜杠有时可能仍然合适。例如,long,multiple with -statements不能使用隐式延续,因此可以接受反斜杠。

虽然它建议缩进,但你的行应该是这样的:

with tempfile.NamedTemporaryFile(prefix='malt_input.conll.',
      dir=self.working_dir, mode='w', delete=False) as input_file, \
      tempfile.NamedTemporaryFile(prefix='malt_output.conll.', 
      dir=self.working_dir, mode='w', delete=False) as output_file:
    pass

建议你让它在下面的代码块中缩进一个明显不同的空间,这样就可以更清楚地看到with行结束和块开始的位置。

但如果将参数括在括号中,则实际上

with (tempfile.NamedTemporaryFile(prefix='malt_input.conll.',
      dir=self.working_dir, mode='w', delete=False)) as input_file, (
      tempfile.NamedTemporaryFile(prefix='malt_output.conll.', 
      dir=self.working_dir, mode='w', delete=False)) as output_file:
    pass

这当然取决于您确切的句子安排,并且您的里程可能会因行尾的括号是否比反斜杠更好而有所不同。

答案 1 :(得分:1)

PEP-8实际上给出了两种类似情况的例子:

示例1(看起来最适用,因为它使用public static Product[] GetProducts(string[] prodIDs) { return ( from p in GetProducts() from q in prodIDs where p.ProductID.IndexOf(q) > -1 select p) .ToArray<Product>(); } 语句):

with

示例2:

with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

看起来斜杠是一种允许的处理方法(但如果你将文件params包装在括号中,最终是不必要的)。