python相当于perl的@ {$ obj->方法($ args)}或%{$ obj->方法($ args)}

时间:2013-05-16 14:32:53

标签: python perl idioms

标题演示了我希望在我的python脚本中传达的perl习语。我意识到这可能被解释为不良做法,可能是由于(缺乏)异常处理。尽管如此,我发现在(一次性/个人)公用事业中执行此类操作的价值。

2 个答案:

答案 0 :(得分:1)

Python没有像Perl那样的各种变量的概念。标量,列表和dicts都存储在同一种变量中。所以这个“成语”不适用。只需直接使用返回的值。

一些Perl代码示例:

sub foo {
    return [ qw(a b c) ];
}

@list = @{foo()};
say $list[0];
say $list[1];
say $list[2];

等效的Python代码:

def foo():
        return ("a", "b", "c")

list = foo()
print list[0]
print list[1]
print list[2]

当你提到缺乏异常处理时,我不知道你的意思。

答案 1 :(得分:0)

这个问题的三个字母的答案是:嗯?

答案越长:Python没有引用。没有tuplerefs或dictrefs,并且没有函数可以返回它们,并且调用者无法将tuplerefs或dictrefs转换为元组或字典。没有等价物。

这个Perl:

sub foo {
  qw/a b c/
}
my @array = foo;
print $array[0];
print $array[1];
print $array[2];

在另一个答案的Python中,与其他答案中的Perl相比,“不等同于”。

但它与Perl的其他部分不同。当您查看以下调用时,它会有所不同:

my @array = (this_foo(), this_foo(), this_foo());
# @array is now: ('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'), and one-dimensional.

my @array = (that_foo(), that_foo(), that_foo());
# @array is now: (['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']), and two-dimensional.

但这对于Python来说只是一个不同之处。