什么是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吗?
答案 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包装在括号中,最终是不必要的)。