在调用super()之前是否存在要进行某些处理的情况?
这是一个人为的例子.有更好的例子吗?这被认为是pythonic吗?
class Base(object):
def __init__(self, name):
print "Base %s created" % name
self._name = name
class UpperBase(A):
""" Similar to base but the name is in uppercase. """
def __init__(self, name):
name = name.upper()
super(UpperBase, self).__init__(name)
Run Code Online (Sandbox Code Playgroud) 我需要更新一个文件.我读了它,并写出来的变化.但是,我更愿意写入临时文件并将其重命名.
temp = tempfile.NamedTemporaryFile()
tempname = temp.name
temp.write(new_data)
temp.close()
os.rename(tempname, data_file_name)
Run Code Online (Sandbox Code Playgroud)
问题是tempfile.NamedTemporaryFile()
使临时文件中的/tmp
文件系统不同.这意味着os.rename()
失败.如果我使用shlib.move()
而不是我没有"mv"提供的原子更新(对于同一文件系统中的文件,yadda,yadda等)
我知道tempfile.NamedTemporaryFile()
带一个"dir"参数,但data_file_name可能是"foo.txt",在这种情况下dir ='.'; 或者data_file_name可能是" /path/to/the/data/foo.txt
",在这种情况下dir =" /path/to/the/data
".
我真正喜欢的是临时文件是data_file_name +"一些随机数据".这样做的好处是会以一种留下有用线索的方式失败.
建议?
我正在使用argparse构建一个带有子命令的命令:
mycommand [GLOBAL FLAGS]子命令[FLAGS]
我希望全局标志能够工作,无论它们是在子命令之前还是之后.有没有一个干净的方法来做这个不涉及重复代码?
例如:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subparser_name')
parser.add_argument('--disable') # This flag...
sp = subparsers.add_parser('compile')
sp.add_argument('zones', nargs='*')
sp.add_argument('--disable') # Is repeated...
sp = subparsers.add_parser('launch')
sp.add_argument('zones', nargs='*')
sp.add_argument('--disable') # over and over...
Run Code Online (Sandbox Code Playgroud)
我想为许多旗帜做这件事,所以一遍又一遍地重复自己似乎...... unpythonic.
用 Go 编写的程序通过 shell 执行 PowerShell 来完成某些任务。这很慢,因为每次调用都会exec.Command()
启动 PowerShell,运行一个命令,然后退出。我们正在运行数百个命令,并且启动 PowerShell 数百次是一个很大的开销。
如果提前知道命令,我们可以简单地生成 powershell 脚本并执行它。然而,需要运行的命令是动态生成的,因此这对我们不起作用。
这是我们用来运行的代码command
out, err := exec.Command("powershell", "-NoProfile", command).CombinedOutput()
if err != nil {
// ...
}
Run Code Online (Sandbox Code Playgroud)
是否可以启动一次 PowerShell 并为其提供单独的命令?
更新:有人问我正在运行哪些 PS 命令。有些是:
Get-DnsServerResourceRecord -ComputerName FOO -ZoneName BAR
Remove-DnsServerResourceRecord -Force -ComputerName "FOO" -ZoneName "BAR" -Name "X" -RRType "Y" -RecordData "Z"
Add-DnsServerResourceRecordX-ComputerName FOO -ZoneName BAR ...
2022-03-09 更新:我很不好意思地说,我发现了缓慢问题,而且这并不是我提出问题时所假设的。正在运行的 PowerShell 命令偶尔会获取需要很长时间才能处理的庞大数据集。所以,问题根本不在于 Go 或 exec!也就是说,这个问题对于想要批量命令的人来说仍然有用。
从 Perl 迁移到 Python 后,我想念的一件事是“Deparse”。它不仅重新格式化 perl 代码,而且减少了括号的数量,甚至将旧功能更改为等效的新功能。
例如:
$ perl -MO=Deparse -e 'if (($x == $b) || ($foo == $bar )) { &thing };'
if ($x == $b or $foo == $bar) {
&thing;
}
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
Python有没有类似的东西?
如果$FOO
设置,我想运行:
cd "$OUTPUTDIR" && fpm -s dir -t rpm \
-a x86_64 \
--epoch "${PKGEPOCH}" \
-n "${PACKAGENAME}" \
--version "${PKGVERSION}" \
--iteration "${PKGRELEASE}" \
-C "$OUTPUTDIR/installroot" \
--description="${PKGDESCRIPTION}" \
.
Run Code Online (Sandbox Code Playgroud)
如果$FOO
没有设置,我根本不想包含该标志.
如果--description=
(空),程序将失败.
但是,有时描述包括引号和其他特殊字符,所以我不想这样做:
if [[ -z "PKGDESCRIPTION" ]]; then
D=--description="${PKGDESCRIPTION}"
fi
cd "$OUTPUTDIR" && fpm -s dir -t rpm \
-a x86_64 \
--epoch "${PKGEPOCH}" \
-n "${PACKAGENAME}" \
--version "${PKGVERSION}" \
--iteration "${PKGRELEASE}" \
-C "$OUTPUTDIR/installroot" \
$D
.
Run Code Online (Sandbox Code Playgroud)
如果我把引号括起来$D
那么它就变成了一个额外的(空白)arg. …
我使用不同的列表大小对代码进行基准测试(大小为S的列表)Go基准测试显示ns/op,但我想要的是(ns/op)/ S.
换句话说,输出go test -bench=.
是:
BenchmarkMy10-4 100000000 15.7 ns/op
BenchmarkMy20-4 50000000 33.8 ns/op
BenchmarkMy30-4 30000000 43.8 ns/op
BenchmarkMy40-4 30000000 49.3 ns/op
BenchmarkMy50-4 30000000 56.6 ns/op
BenchmarkMy1000-4 2000000 686 ns/op
BenchmarkMy10000-4 200000 6685 ns/op
BenchmarkMy100000-4 20000 65425 ns/op
Run Code Online (Sandbox Code Playgroud)
"My10"中的"10"表示10个项目的列表(S = 10).
虽然知道不同列表大小的ns/op很有用,但我还想知道ns/op/S(列表中每个项目的时间).
现在我将结果粘贴到电子表格中并在那里进行数学运算.但是,我希望"go test"为我输出这些信息.
我的main_test.go文件如下所示:
import "testing"
var result int
func benchmarkMy(i int, b *testing.B) {
var r int
mylist := MakeList(i)
b.ResetTimer()
for n := 0; n < b.N; n++ {
r = My(mylist)
}
result = r …
Run Code Online (Sandbox Code Playgroud) 我正在编写的perl脚本需要解析一个包含Makefile等延续行的文件.即以空格开头的行是前一行的一部分.
我写下面的代码,但不觉得它很干净或perl-ish(哎呀,它甚至不使用"重做"!)
有许多边缘情况:奇数位置的EOF,单行文件,以空行(或非空白行或连续行)开头或结尾的文件,空文件.我的所有测试用例(和代码)都在这里:http://whatexit.org/tal/flatten.tar
你能编写更清晰的perl-ish代码,通过我所有的测试吗?
#!/usr/bin/perl -w
use strict;
sub process_file_with_continuations {
my $processref = shift @_;
my $nextline;
my $line = <ARGV>;
$line = '' unless defined $line;
chomp $line;
while (defined($nextline = <ARGV>)) {
chomp $nextline;
next if $nextline =~ /^\s*#/; # skip comments
$nextline =~ s/\s+$//g; # remove trailing whitespace
if (eof()) { # Handle EOF
$nextline =~ s/^\s+/ /;
if ($nextline =~ /^\s+/) { # indented line
&$processref($line . $nextline);
}
else {
&$processref($line); …
Run Code Online (Sandbox Code Playgroud) 有没有更好的方法在执行之前保存命令行?
我的许多 /bin/bash 脚本构建了一个很长的命令行。我通常将命令行保存到文本文件中,以便于调试和(有时)执行。
我的代码到处都是这个习语:
echo >saved.txt cd $NEW_PLACE '&&' command.py --flag $FOO $LOTS $OF $OTHER $VARIABLES
cd $NEW_PLACE && command.py --flag $FOO $LOTS $OF $OTHER $VARIABLES
Run Code Online (Sandbox Code Playgroud)
显然,在两个地方更新代码很容易出错。不太明显的是,某些部分需要在第一行引用,但不需要在下一行引用。因此,我无法通过简单的复制粘贴来进行更新。如果命令包含引号,它会变得更加复杂。
必须有更好的方法!建议?
我可以在Linux上的Makefile中设置PATH,但不能在Mac OS X中设置.在OS X中,PATH设置但不会被使用.这是一个演示:
在CentOS 6上使用bash 4.1.2(1)-release和GNU Make 3.81
$ pwd
/tmp/experiment
$ find * -type f -ls
132133 4 -rw-rw-r-- 1 tlim tlim 113 Aug 26 11:01 Makefile
132132 4 -rwxrwxr-x 1 tlim tlim 28 Aug 26 10:59 bin/myprog
$ cat Makefile
export PATH := $(shell /bin/pwd)/bin:$(PATH)
what:
@echo PATH=$$PATH
@echo PATH=$(PATH)
which myprog
myprog
$ cat bin/myprog
#!/bin/bash
echo HERE I AM.
$ make what
PATH=/tmp/experiment/bin:/usr/stack/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
PATH=/tmp/experiment/bin:/usr/stack/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
which myprog
/tmp/experiment/bin/myprog
myprog
HERE I AM.
Run Code Online (Sandbox Code Playgroud)
这是使用GNU Make 3.81在Mac OS …
python ×4
bash ×2
go ×2
perl ×2
argparse ×1
benchmarking ×1
debugging ×1
file ×1
fileparsing ×1
gnu-make ×1
macos ×1
makefile ×1
powershell ×1
redo ×1
super ×1