如何在保留API时弃用行为?

时间:2012-10-05 05:06:25

标签: perl

我有一个API,我想改变它的行为。我最初制作方法is_success意味着“绿灯”,但“红灯”并不例外,它仍然意味着灯光正常工作。我现在希望is_success仅在出现建议时为假,并添加了is_greenis_red(注意:还有“黄色”和“紫色”状态)我的API用于补充特定的检查(目前黄色和紫色抛出异常,但稍后可能会进行状态检查)。

有什么好的方法可以从代码中发出行为正在改变的警告吗?还是变了?如果用户知道,允许关闭这些警告? (注意:已经在更改日志中添加了弃用通知)

3 个答案:

答案 0 :(得分:2)

您可以使用Perl的词法警告类别。有一个deprecated类别,或者您可以将包/模块注册为警告类别。

{
    package My::Foo;
    use warnings;

    sub method {
        (@_ <= 2) or warnings::warnif('deprecated', 'invoking ->method with ... ')
    }
}

{
    package My::Bar;
    use warnings;
    use warnings::register;

    sub method {
        (@_ <= 2) or warnings::warnif('invoking ->method with ... ')
    }
}

{
    use warnings;
    My::Foo->method(1);
    My::Foo->method(1, 2);
    My::Bar->method(1, 2);
}

{
    no warnings 'deprecated';
    My::Foo->method(1, 2);
    no warnings 'My::Bar';
    My::Bar->method(1, 2);
}

请参阅warningsperllexwarn

答案 1 :(得分:1)

是的,您可以使用warn命令。它会显示警告,但也可以通过为$ SIG {' WARN '}指定一个空子来捕获它们,这将停止显示的消息。

# warnings are thrown out with this BEGIN block in your code.
BEGIN {
  $SIG{'__WARN__'} = sub {  }
}

# prints the warning to STDOUT, if $SIG{'__WARN__'} is set to the default
warn "uh oh, this is deprecated!";

有关详情和其他示例,请参阅perdocs,http://perldoc.perl.org/functions/warn.htmlhttp://perldoc.perl.org/perllexwarn.html

答案 2 :(得分:1)

我总是发现MIME::Head使用的方法很有用且很有趣。

  

此方法已被弃用。有完整的原因,请参阅MIME :: Parser中的“decode_headers”。如果你绝对必须使用它并且不喜欢警告,那么提供一个FORCE:

     

“I_NEED_TO_FIX_THIS”             闭嘴,做到这一点。不建议。             仅供那些需要保持旧脚本运行的人使用。

     

“I_KNOW_WHAT_I_AM_DOING”             闭嘴,做到这一点。不建议。             为那些真正知道自己在做什么的人提供。

这个想法是只能通过提供一个魔术参数来抑制弃用警告,该参数记录了警告被抑制的原因。