我们将继续发表有关这两种语言之间异同的一系列文章的翻译 。
今天,我们将讨论字典序列化,JSON,常规,错误和异常。
本系列的其他文章:
- 第一部分是类型转换,三元运算符,通过属性名称,字典,列表,字符串,字符串连接访问属性。
- 这篇文章
- 第三部分 :现代Python和JS:字符串模式(f字符串),列表解压缩,lambda函数,列表迭代,生成器,集合。
- 第四部分是函数参数,创建并使用类,继承,setter getter和类属性。
杰森
当使用许多API时,将对象序列化为JSON对象很方便,以便于传输和后续解析。
Python有一个标准的json模块:
import json json_data = json.dumps(dictionary, indent=4) dictionary = json.loads(json_data)
在这里,我们以4个空格的缩进格式格式化JSON。
在JS中,有一个JSON对象,其中包含用于创建和解析JSON字符串的方法:
json_data = JSON.stringify(dictionary, null, 4); dictionary = JSON.parse(json_data);
用常规解析字符串
在上一篇文章中,我们将多行合并为一个。 但是如何将一个长字符串分成几个部分,特别是如果分隔符不是单个字符(如逗号),而是整个范围的不同选项时? 这就是正则表达式和split()
方法的用武之地。
在Python中, split()
方法引用正则表达式模式。 以下是将文本字符串拆分为标点句子的方法:
import re
在JS中, split()
方法引用字符串:
按图案定期搜索
正则表达式通常用于验证表单中的数据。
例如,要验证输入的电子邮件地址的正确性,必须将其与正则表达式模式进行比较。
课程翻译的作者与常规人员检查地址是一项艰巨的任务, 比本文给出的方法要复杂一些
在Python中,它将如下所示:
import re
如果文本的一部分与模板匹配,则使用group()
方法将返回整个部分,您可以在其中选择模板中定义的各个组。
0-整个行(子)匹配,1-第一组,2-第二组,依此类推。
如果找不到匹配项,则将返回类型为None
的对象。
在JS中,有一个字符串方法match()
返回字符串的匹配部分或null
。
在JS中,匹配的对象看起来像一个数组。 索引为[0]的元素是匹配的整个(子)行,第一个元素为第一个组,第二个元素为第二个,依此类推。 -全部符合模板中定义的组。
有时,除了搜索外,还需要确定样本在文本中的位置。 可以使用search()
方法完成。
在Python中,此方法引用正则表达式并返回匹配的对象。 此匹配对象具有start()
方法,该方法返回主行中此子字符串出现的开始:
text = 'Say hi at hi@example.com' first_match = pattern.search(text) if first_match: start = first_match.start()
JS方法具有字符串方法search()
该方法返回子字符串开头的索引。 如果未找到匹配项,则为-1
。
text = 'Say hi at hi@example.com'; first_match = text.search(pattern); if (first_match > -1) { start = first_match;
使用正则表达式替换为模式
通常,当您要清除数据或向文本中添加一些属性时,需要替换模板。 例如,我们可以一行一行,使所有遇到的电子邮件地址都链接:
Python为此提供了一个sub()
regex模式方法:
html = pattern.sub( r'<a href="mailto:\g<0>">\g<0></a>', 'Say hi at hi@example.com', )
JS开发人员可以使用replace()
字符串方法:
html = 'Say hi at hi@example.com'.replace( pattern, '<a href="mailto:$&">$&</a>', );
在Python中,匹配组可用\g<0>, \g<1>, \g<2>
等。
在JS中,例如$&, $1, $2
等。
也可以用功能代替匹配部分。 当替换源文本的换行或计数,收集或获取有关文本的其他信息时,此类功能很有用。 例如,当我在替换时使用函数调用时,可以编写HTML语法突出显示。
让我们更改“大写字母”中的所有电子邮件地址。
在Python中,replace函数获取匹配的对象。 我们使用group()方法对匹配的文本执行操作,并将其作为替换返回:
text = pattern.sub( lambda match: match.group(0).upper(), 'Say hi at hi@example.com', )
在JS中,replace函数获取整个字符串匹配,第一次出现,第二次出现等。 我们执行必要的操作并返回修改后的行:
text = 'Say hi at hi@example.com'.replace( pattern, function(match, p1, p2) { return match.toUpperCase(); } );
错误处理
与Python相比,基于前端浏览器的JavaScript通常不用于写入/读取文件或访问数据库。 因此,与Python中的try..except
块相比, try..catch
块在JS中很少见。
但是,无论如何,错误处理都可以在用户脚本中执行,可以从库函数中调用并在主代码中截取。
在下面的MyException
示例中,我们将定义MyException
,在函数中MyException
它,并在try..except..finally
块中查看如何捕获和处理它:
class MyException(Exception): def __init__(self, message): self.message = message def __str__(self): return self.message def proceed(): raise MyException('Error happened!') try: proceed() except MyException as err: print('Sorry! {}'.format(err)) finally: print('Finishing')
以下JS代码执行相同的操作-我们定义MyException
类,在函数中MyException
它,在try..catch..finally
块中对其进行拦截和处理:
function MyException(message) { this.message = message; this.toString = function() { return this.message; } } function proceed() { throw new MyException('Error happened!'); } try { proceed(); } catch (err) { if (err instanceof MyException) { console.log('Sorry! ' + err); } } finally { console.log('Finishing'); }
在两种语言中, MyException
类都有一个message
参数和一个取决于message
值的字符串表示方法。
当然,仅在发生错误的情况下才应引发/引发异常。 并且如果您已在模块中识别出此错误。
结论
- 从JSON序列化到/从JSON序列化非常简单-Python中有什么,JS中有什么。
- 常规是两种语言中功能强大的文字处理工具。
- 您可以使用功能进行替换。
- 对于更复杂的情况,可以使用调用,拦截和错误处理。
正如上次所说,您可以逐行匹配此处提供的代码示例,以了解类似的数据结构和使用它们的方法:字符串,数组,字典,对对象的访问。
在下一部分中,我们将讨论文本模式,解压缩列表,lambda函数,不使用索引,生成器和集合的迭代。