皮皮网

【在线聚合直播源码】【jsonapi源码】【vmm 源码】emoji源码

2024-11-21 00:28:04 来源:线程控制 源码

1.一些你不知道的Python Tips
2.iOS TTTAttributedLabel 的三个坑

emoji源码

一些你不知道的Python Tips

       以下是一些有趣的Python技巧和小例子,旨在帮助您更好地理解和运用Python。

       在Python中,字典的更新可以通过更新方法来完成。该方法接收一个字典作为参数。有趣的在线聚合直播源码是,除了字典,方法还可以接收包含键值对的列表作为参数。例如,直接传入包含(k, v)这样的2项元组的列表也可以更新字典。然而,如果列表中存在只有单个元素的项,则更新可能不会成功,但其他正常的项(如4和5)会被更新。

       我曾经在博客中探讨过Python元组的赋值问题,这也引发了我对字典更新方法的兴趣。方法的jsonapi源码签名显示,除了字典,还可以接收可迭代对象或关键字参数作为参数,并且可以混用。方法签名说明只要传入的参数或其中的项有keys方法即可。

       在编写代码时,我们经常遇到需要处理长字符串的情况,比如编写SQL语句时可能会超过单行长度限制。在Python中,vmm 源码我们可以通过隐式的字符串连接来解决这个问题。然而,这种方法也可能会带来一些隐蔽的错误。例如,如果字符串之间没有适当的分隔符(如逗号),它们可能会被隐式地连接在一起,这可能会使开发者在调试时花费大量时间来查找错误。

       在Python中,oad 源码print函数提供了一种灵活的方式来实现多样化的打印效果。作为函数使用,print支持多个参数,并允许在打印时设置分隔符、文件输出以及强制刷新流。例如,使用`print(*lst, sep=', ')`可以方便地将列表项以逗号分隔进行打印。另外,mblen 源码print函数还支持`file`参数,可以直接将内容打印到文件中。此外,`flush`参数可以控制是否在每次迭代后强制刷新流,以实现更流畅的输出效果。

       在Python 3中,`print`语句被改造成一个函数。这一改变提供了更多的灵活性和控制,使开发者能够实现更多样化的打印效果。例如,通过使用`print`函数的`*lst, sep=', '`参数,可以将多个列表项以特定的分隔符(如逗号)进行连接并打印。此外,`print`函数还支持`file`参数,允许直接将输出内容写入文件。同时,`flush`参数允许控制流的刷新频率,这对于实时输出或需要控制输出速度的场景特别有用。

       Python还隐藏了两个模块:`__hello__`和`__phello__`。这些模块主要用于CPython的测试,由`freeze`工具生成,主要用于测试CPython,没有实际应用价值。对于这些模块的具体源码,您可以参考相关链接。

       在Python 3中,可以直接通过CLDR(Unicode Common Locale Data Repository)中的short name打印emoji表情,格式为`'\N{ CLDR_SHORT_NAME}'`。这样操作非常方便,无需额外安装emoji包即可使用emoji表情。

       在使用emoji字符串时,需要注意它们的特殊性质和用法。为了获取所有可用的emoji,您可以参考相关链接。这些链接提供了emoji的详细信息和使用示例,帮助您在Python代码中更有效地使用emoji表情。

iOS TTTAttributedLabel 的三个坑

        TTTAttributedLabel 真的是个非常常用的第三方库了,很多 app 都用它来给文本加点击事件,比如一段文字中带有能点击的 tag。

        但是这个库比较老了,虽然貌似一直还有人维护,还是有一些比较坑的地方;而且里面主要用的 CoreText,也存在一些 CoreText 的问题。我的项目从比较早期就一直在用这个库,也踩了一些坑。下面分享比较重大的 3 个坑,供大家参考。

        给文本加点击功能的同时,我们往往需要改变可点击的文本样式,比如图中用了绿色。要改变文本样式,第一反应可能是用 attributedText ,设为一个 attributedString 。不幸的是,由于 TTTAttributedLabel 作者在创作这个库的时候, attributedText 这个属性还没有出生,因此这个库在这方面支持得不太好。

        我曾经遇到一个问题,就是用 attributedText 改过的文本属性在显示中没体现出来。查了之后发现,针对点击区域的文本样式改动最好使用 setLinkAttributes: 与 setActiveLinkAttributes: 两个 API。形如:

        而针对全体文本的设置,比如段落格式、行距等,目前用 attributedString 没有发现什么大问题。但有一次我发现,cell 在重用的时候,之前设的 link 都没有清除。尽管样式上看上去不是 link 的样式,但手指能点,点上去变成了 activeLink 的样式。来回滚动重用次数多了,label 上到处都能点。怎么回事呢?

        上 github 查 issues,发现一个神奇的设定:更改 TTTAttributedLabel 的 text 属性,不能用:

        而要用:

        即使你传入的是带格式的 NSAttributedString ,而不是普通的 NSString ~否则它不能正常清除之前设置的 link。尽管作者声称在 年就解决了这个问题,然而似乎并没有,还是需要这样写。奇妙吧,没想到吧,违法直觉吧。这是第一个坑。

        第一次用的时候,我还担心会不会 label 上的点击区域过小,用户点不上。事实证明我多虑了。设置了 link 之后,不仅点那排字完全能触发点击事件,甚至点到它下一行还是能触发…… 有时候 link 比较长,一行整体加了 link,结果把整个 cell 都祸害了。

        后来怎么改的呢?一番寻找,我在源码里找到了一个 - (void)commonInit 方法,里面有一行 _extendsLinkTouchArea = YES; 是个扩大点击区域的属性,而且默认值为 YES 。它改成 NO ,问题就解决了。这是我遇到的第二个坑。

        这并不是 TTTAttributedLabel 本身的问题,而是 CoreText 的问题。就是我发现多行 label,设定 numberOfLines 既不为 0 也不为 1 的,文本里出现 emoji 等 unicode 字符的时候会内存暴涨,非常夸张,能一直涨到几百M,直至 crash。如果设了 linkAttributes 才有这问题,不设没事。

        而且这个 crash 并不停 exception 断点,都不知道是哪里出的问题。用了 instrument 里的 allocation 工具,发现是 TTTAttributedLabel 的 - (CGSize)sizeThatFits:(CGSize)size 方法,一到里面的 CTFramesetterSuggestFrameSizeForAttributedStringWithConstraints 这个 C 函数就死。 再往里跟,发现是 CoreText 的 CTFramesetterCreateFrame 这个函数出的问题。首次调用这个方法的时候 width 都是 -1,其他参数也都一样,但只要文本里带 emoji 就会出问题。

        看起来是个 CoreText 的 bug,而且貌似是个 iOS 9 新出的 bug,具体原因未知。好在解决方法并不复杂,只要把 label 的 preferredMaxLayoutWidth 设成非 0 的数就能消除这个 crash 了。当然为了正确显示,还是要设成正确的值,即文本实际显示的宽度。

        另外 有人发现了另一个 emoji 导致 crash 的问题 ,是在设置 link 的 range 时如果 range 的两头正好切在 Unicode 字符的中间就会导致 crash,表现跟我遇到的问题差不多,都是内存暴涨。解决方法是正确计算 Unicode 字符的长度。这个 issue 没有解决我的问题,不过可能有其他人会遇到,所以在此一并列出。

        以上就是我使用 TTTAttributedLabel 这个库时曾经遇到的一些问题。瑕不掩瑜,这个库还是很好用的,至少免去了写 CoreText 那一堆语法的麻烦。有其他问题可以上 github 提 issue,貌似会有人理。祝大家使用愉快。

        我参考了:

        setAttributedText not reseting links

        UILabel Link Hit Detection too large for small labels.

        iOS 9.0.2 and iOS 9.1 Crash