为了提供一个可能避免此处评论噪音的答案,我将尝试另一个答案。
您原来问题中的两个 pragmata 实际上扩展到:
use strict "vars";
use strict "refs";
use strict "subs";
use warnings;
依次回答每个问题:
- 的效果
use strict "vars"
是在未首先声明变量存在的情况下引用变量而导致编译时错误(例如 C、C++ 和 Java 等更多静态语言中的默认设置)。因为 Python 没有特定的语法来声明变量存在,所以它没有等效的语法。在 Python 中分配一个名称总是会创建它(如果该名称首先不存在)。这个功能的strict
没有 Python 等效项,并且它提供的安全性无法重新创建。
Eg:
$ perl -c -e 'use strict "vars"; $foo = 1'
Global symbol "$foo" requires explicit package name at -e line 1.
-e had compilation errors.
$ perl -c -e 'no strict "vars"; $foo = 1'
-e syntax OK
- 的效果
use strict "refs"
是禁止使用包含(现有或新)变量名称的纯字符串作为对变量本身的引用。 Python 不会执行此操作,因此无需禁用它。
Eg:
$ perl -e 'use strict "refs"; ${"message"} = "hello"; print $message'
Can't use string ("message") as a SCALAR ref while "strict refs" in use at -e line 1.
$ perl -e 'no strict "refs"; ${"message"} = "hello"; print $message'
hello
- 的效果
use strict "subs"
是导致编译时调用已知不存在的函数的任何尝试。 Python 不执行任何此类检查,也无法启用此类功能。
Eg:
$ perl -c -e 'use strict "subs"; foo'
Bareword "foo" not allowed while "strict subs" in use at -e line 1.
-e had compilation errors.
$ perl -c -e 'no strict "subs"; foo'
-e syntax OK
- 的效果
use warnings
是为了在编译和运行时对各种类别的行为启用更多警告,这些行为在早期版本中是默认的,有时可能是需要的,或者从来都不是一个好主意,但严格来说并不是一个错误。例如,使用未初始化的值作为数字通常应该发出警告,但最初并没有这样做。
Eg:
$ perl -e 'use warnings; my $u; print 2 + $u'
Use of uninitialized value $u in addition (+) at -e line 1.
2
$ perl -e 'no warnings; my $u; print 2 + $u'
2
最后;有人评论说 Python 在以下方面具有类似的功能__future__
。然而,这不应该被认为与 Perl 的 pragmata 类似,因为后者大多数都是词法范围的,并且可以根据需要在小范围内启用或禁用; Python 在哪里__future__
仅对整个源文件启用。
Eg.
use strict;
use warnings;
my $total;
$total += count_things($_) for @list;
{
no warnings 'uninitialized';
printf "The total is %d\n", $total;
}
这是一个有点人为的示例,但这一个演示了如何使用no warnings 'uninitialized'
禁用有关在以下范围内使用未初始化值的警告printf
声明,同时仍然在其他地方启用其他警告。
综上所述:Python 没有use strict
或任何近乎等效的任何安全功能,它提供的安全功能要么是强制性的,要么在 Python 语言中不可用,并且没有use warnings
。它提供的那些功能仅在文件级别启用,不能根据范围有选择地启用或禁用。
Edit:实际上我现在已经得知Python确实有一些可控的警告标志,可以根据需要启用和禁用它们。