【问题标题】:python equivalent to perl's @{$obj->method($args)} or %{$obj->method($args)}python 相当于 perl 的 @{$obj->method($args)} 或 %{$obj->method($args)}
【发布时间】:2013-05-11 12:20:15
【问题描述】:

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

【问题讨论】:

  • Python 是严格类型的。如果obj.method(args) 返回一个序列(-like)值,只需将其用作序列即可。如果它返回一个映射(类似)值,只需将其用作映射。
  • 对于不熟悉惯用 Perl 的 Pythonistas 希望回答,您能否真正描述一下该惯用语应该完成的工作并提供示例?就目前而言,问题本身实际上并没有内容。
  • -1:这个问题没有解释这个成语的作用,从而疏远了许多潜在的未来读者和 Python 爱好者。
  • @array = $obj->method($args) 和 @{$obj->method($args)} 在本质上是等价的。我只是尝试使用返回的值而不必分配变量。
  • 我不懂 Perl,所以无法回答这个问题。你应该真正解释它的作用

标签: python perl idioms


【解决方案1】:

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

更长的答案: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 来说毫无意义的区别。

【讨论】:

    【解决方案2】:

    Python 没有 Perl 的不同类型变量的概念。标量、列表和字典都存储在同一种变量中。所以这个“成语”是不适用的。直接使用返回值即可。

    一些示例 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]
    

    当您提到缺乏异常处理时,我不知道您是什么意思。

    【讨论】:

    • 我的问题可能措辞不佳,很简单,有没有办法做到这一点? obj.method()['key'] != 0
    • @user2390378 当然可以。按照我的示例代码,print foo()[0] 打印 a
    • 抱歉花了一段时间才沉入其中,一定是昨晚星际迷航的午夜表演:)
    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 2018-06-24
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多