在 Python 环境中管理 Perl 习惯
Posted
技术标签:
【中文标题】在 Python 环境中管理 Perl 习惯【英文标题】:Managing Perl habits in a Python environment 【发布时间】:2010-12-02 03:21:58 【问题描述】:Perl 习惯很难改掉。两种语言之间的变量声明、作用域、全局/局部不同。是否有一组推荐的 Python 语言习语可以减轻从 perl 编码到 Python 编码的过渡痛苦。
细微的变量拼写错误会浪费大量时间。
我知道变量声明问题在 python 人中是准宗教问题 我不是在争论语言的改变或功能,只是一个可靠的桥梁 不会导致我的 perl 习惯的 2 种语言使我在 python 方面的努力失败。
谢谢。
【问题讨论】:
关于吃掉你生命的拼写错误,***.com/questions/613364 --summary 中有一些有趣的相关点:人们推荐使用像 pylint 这样的静态检查器 你能解释一下你所说的“变量声明问题”是什么意思吗?我知道 Perl 和 Python,虽然语言确实不同,但我不确定您指的是哪个问题。 在 perl 中“使用严格;”是我们许多人的主食。我对python的理解(不是很好)是python没有这样的构造。这就是我所说的“变量声明问题”。谢谢。 @J.F. Sebastian,Python 的 NameError 异常发生在运行时。 strict 在编译时捕获这些错误。有关 Perl 的 stict 和 Python 的更多信息,请参阅我在之前的评论中链接的问题。 哪些细微的拼写错误在浪费时间?在运行时可能不会发现拼写错误(x = 1; if y: xx = 2; print x),但在我使用 Python 的几个月中,我从未发现这是个问题。 Perl 的主要问题是,在没有严格的情况下,拼写错误会默默地成为对 null 的引用,而忘记“我的”会将你的变量变成全局变量——这些都是严重的问题,但与 Python 非常不同且无关。 (顺便说一句,你真的应该设置一个名字,这样我们就可以称呼你,而不是“未知”。) 【参考方案1】:将 Python 类拆分为单独的文件(如在 Java 中,每个文件一个类)有助于发现范围界定问题,尽管这不是惯用的 Python(即不是 Pythonic)。
我在写了很多 perl 之后一直在写 python,发现 tchrist 的这个很有用,尽管它很旧:
http://linuxmafia.com/faq/Devtools/python-to-perl-conversions.html
习惯于不使用 perl 最出色的变量作用域是我的 perl->python 转换的第二个最困难的问题。如果你有很多 perl:第一个是显而易见的:CPAN。
【讨论】:
我认为你不知道 pypi。 我知道 pypi 并且可以将其与 CPAN 进行比较。在 CPAN 上,我发现我的大部分项目已经在那里编码,因为它有我需要的东西。在 pypi 中,我找到了很棒的东西,但对我来说,这是一个较小的百分比。这取决于项目。对于接口、文本处理和数据转换的一般过程,我更喜欢 Perl/CPAN。对于数值算法、物流以及与其他语言的集成,我更喜欢 Python/pypi。我最新的图像处理是 Python,我最新的 CAD 工具集成是 Perl。我逐个项目选择语言和库。还有 C++、vbs 等等。【参考方案2】:我喜欢这个问题,但我没有任何 Perl 经验,所以我不知道如何最好地建议你。
我建议您在 Google 上搜索“Python idioms”。你会发现一些宝石。特别是:
http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
http://docs.python.org/dev/howto/doanddont.html
http://jaynes.colorado.edu/PythonIdioms.html
至于变量“声明”问题,这是我对你最好的建议:
请记住,在 Python 中,对象有自己的生命,与变量名分开。变量名是绑定到对象的标签。在任何时候,您都可以将名称重新绑定到不同的对象,也许是完全不同的类型。因此,这是完全合法的:
x = 1 # bind x to integer, value == 1
x = "1" # bind x to string, value is "1"
Python 实际上是强类型的;如果您不相信我,请尝试执行代码 1 +“1”,看看它的效果如何。在没有显式类型强制的情况下,值为 1 的整数对象不接受添加字符串值。所以 Python 名称永远不会有标记变量属性的符号字符;这不是 Python 做事的方式。任何合法的标识符名称都可以绑定到任何类型的任何 Python 对象。
【讨论】:
"将名称重新绑定到不同的对象"... Perl OO 系统取自 Python,因此可以在 Perl 中完成。 正如我所说,我没有真正的 Perl 经验,所以我对 Perl OO 系统一无所知。但我很好奇:我认为在 Perl 中有一些“符号”可以告诉您有关变量类型的一些信息。例如,@x 是一个数组。你不能重新绑定“@x”来表示不是数组的东西,对吧?在 Python 中没有符号,这是我认为值得评论的差异。 @steveha:在 perl 中,您可以拥有 $x、@x、%x 和 *x,所有不同的类型都具有相同的名称。不完全是这样做的最佳实践,但如果你想要它就在那里。 (但是是的,“@x”表示数组 x,如果这就是你所追求的)。【参考方案3】:在 python 中 $_ 不存在,除非在 python shell 中,并且具有全局范围的变量是不受欢迎的。
在实践中,这有两个主要影响:
-
在 Python 中,您不能像 Perl 那样自然地使用正则表达式,s0 匹配每个迭代的 $_ 并且类似地捕获匹配项更加麻烦
Python 函数往往被显式调用或具有默认变量
然而,当人们认为在 Python 中几乎所有东西都变成了一个类时,这些差异就相当小了。当我以前做 Perl 的时候,我想到了“雕刻”;在 Python 中,我宁愿觉得自己在“作曲”。
Python 没有 Perl 的惯用丰富性,我认为尝试进行翻译可能是错误的。
【讨论】:
perl() if (there's($#nothing) || $rich =~ /about/);【参考方案4】:阅读、理解、关注和喜爱 PEP 8,其中详细介绍了关于 Python 的一切的样式指南。
说真的,如果你想了解Python的推荐习语和习惯,那就是来源。
【讨论】:
【参考方案5】:不要打错变量名。严重地。使用简短、简单、描述性的,在本地使用,不要依赖全局范围。
如果您正在做一个不能很好服务的大型项目,请使用 pylint、单元测试和 coverage.py 确保您的代码符合您的预期。
从other threads 之一的评论中复制:
"'strict vars' 主要是为了阻止输入错误的引用和遗漏的 'my's 创建意外的全局变量(嗯,Perl 术语中的包变量)。这在 Python 中不会发生,因为裸分配默认为局部声明,并且裸露的未分配符号会导致异常。”
【讨论】:
但是一个拼写错误的赋值仍然可以成为一个死变量的声明,导致逻辑错误但没有编译错误。 @hobbs 是的。正如我所说,使用一个好的 ide 并使用 lint/test case?如果它不起作用,它就会失败。简单的。 Python 没有“严格”模式,试图硬塞进去就是破坏语言。如果你的名字太长,以至于经常打错,你需要重命名它们。另外,python 不是 perl。以上是关于在 Python 环境中管理 Perl 习惯的主要内容,如果未能解决你的问题,请参考以下文章