小编Dun*_*tos的帖子

从长度为 1 的元组中解压返回值

假设我有一个虚拟函数,它准确地返回作为参数给出的内容:

def dummy_single(arg1):
    """Repeat the same argument."""
    return arg1
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式使用这个功能:

same_obj1 = dummy_single(obj1)
Run Code Online (Sandbox Code Playgroud)

现在,如果我想允许这个函数接受多个参数并返回相同的参数,我可以打包和解包参数:

def dummy_multiple(*args):
    """Repeat all given arguments."""
    return args
Run Code Online (Sandbox Code Playgroud)

请注意,这个函数恰好是恒等式,但这不是问题的核心。您可以想象任何返回可变长度元组的函数。

当使用多个参数调用时它效果很好:

same_obj1, same_obj2 = dummy_multiple(obj1, obj2)
Run Code Online (Sandbox Code Playgroud)

但是,这不会按预期工作:

same_tuple = dummy_multiple(obj1)
Run Code Online (Sandbox Code Playgroud)

same_obj1包含一个(打包)元组,与前两个示例中的对象相反。我考虑通过以下方式修复此行为,但它看起来并不干净,因为返回的类型根据参数的不同而不同。

def dummy_multiple_fixed(*args):
    """Repeat all given arguments."""
    if len(args) == 1:
        return args[0]
    return args
Run Code Online (Sandbox Code Playgroud)

这不是一个关键问题并且很容易解决。但我找不到一种干净而优雅的方法来解决这个问题。

python design-patterns tuples python-3.x

3
推荐指数
1
解决办法
938
查看次数

如何使用 sed 就地编辑文件描述符

我成功地使用 sed 文件描述符并在标准输出上给出结果。给出一个文件“file.txt”,其中包含:

$ cat file.txt
foo
Foo
Run Code Online (Sandbox Code Playgroud)

我打开 file.txt 的文件描述符,打开子 shell,然后将此文件描述符提供给 sed :

$ (sed "/Foo/c\\bar" <&9 ) 9< file.txt
foo
bar
Run Code Online (Sandbox Code Playgroud)

结果是正确的。

现在,如果我想使用 sed 的 -i 选项就地更改,我就会遇到麻烦。我以读写模式打开文件描述符,然后将其作为输入文件提供给 sed :

$ (sed -i "/Foo/c\\bar" <&9 ) 9<> file.txt
sed: no input file
Run Code Online (Sandbox Code Playgroud)

我不明白为什么缺少输入文件。也许 sed 在使用 -i 选项时需要文件名,而不是文件描述符?

我尝试了一种解决方法,当然,它不能按预期工作:

$ (sed "/Foo/c\\bar" <&9 >&9 ) 9<> file.txt
$ cat file.txt
foo
Foo
foo
bar
Run Code Online (Sandbox Code Playgroud)

虽然我期望:

$ cat file.txt
foo
bar
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助 !杜纳托塔托斯

bash sed file-descriptor sh

1
推荐指数
1
解决办法
1347
查看次数

标签 统计

bash ×1

design-patterns ×1

file-descriptor ×1

python ×1

python-3.x ×1

sed ×1

sh ×1

tuples ×1