用 Python 开发 emoji 表情查找程序

picture.image

今天分享一个前几天构建的小应用程序,用来从命令行搜索emoji表情符号。

它可以通过OS命令行来完成,而且不必单击任何东西即可获得我的表情符号,更加便捷。

该工具支持一次将多个匹配的表情符号复制到剪贴板。

$ emo


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

snake beer fire ninja
Copying 🐍 🍺 🔥 🥷 to clipboard


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

q
Bye

至此,我的剪贴板上所有4个表情符号都写好了,在键盘输入Cmd + V即可。

是不是很酷?

安装并运行程序包

git clone git@github.com:PyBites-Open-Source/emojisearcher.git
cd emojisearcher
poetry install
poetry run emo

poetry 使依赖项管理变得轻而易举,最后一个命令(别名)实际上有效,因为我将其放在 pyproject.toml 文件中:

[tool.poetry.scripts]
emo = "emojisearcher.script:main"

您也可以通过添加以下shell别名来使调用命令更短(就像我在第一个示例中一样) :

$ alias emo
alias emo='cd YOUR_PATH/emojisearcher && poetry run emo'

(将 YOUR\_PATH 更改为项目的路径。)

文件夹结构

由于有了 poetry new ,文件夹结构从一开始就遵循了公认的最佳做法。

我喜欢将测试文件放在专用的 tests / 文件夹中。

我使用 emoji 库中的 EMOJI\_UNICODE 常量来查找emoji表情:

...
EMOJI_MAPPING = EMOJI_UNICODE[LANGUAGE]

...
def get_emojis_for_word(
word: str, emoji_mapping: dict[str, str] = EMOJI_MAPPING
) -> list[str]:
return [emo for name, emo in emoji_mapping.items() if word in name]

然后我使用 pyperclip 复制到操作系统的剪贴板中:

from pyperclip import copy
...
def copy_emojis_to_clipboard(matches: list[str]) -> None:
all_matching_emojis = ' '.join(matches)
print(f"Copying {all_matching_emojis} to clipboard")
copy(all_matching_emojis)

感谢这个库的作者AlSweigart,这是一个很酷的程序包。

如何查找多个表情符号?

在这种情况下,我通过 user\_select\_emoji 函数进入交互模式。

我想用一种创新的方式来触发此交互模式,为此选择了信号字符( SIGNAL\_CHAR ):如果用户的搜索字符串以点( . )结尾,它将进入交互模式。

原因如下:

$ emo


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

snake
Copying 🐍 to clipboard


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

flag
Copying 🏴 to clipboard


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

flag.
1 🏴
2 🏁
3 📪
4 📫
5 🎌
6 ⛳
7 📭
8 📬
9 🏴‍☠️
10 🏳️‍🌈
11 🏳️‍⚧️
12 🚩
13 🏳
Select the number of the emoji you want: 12
Copying 🚩 to clipboard


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

q
Bye

键入“snake(蛇)”后出现的emoji不会出错,但是对于“flag(旗帜)”,它默认选择12个匹配项中的第一个(对于“heart(心脏)”,我们会得到130个匹配的表情符号!),这里我想手动选择一个,因此键入点".",以做出进一步的选择。

测试

还有几件事:

  • @ pytest.mark.parametrize 非常好,可以使您的测试代码更加简洁。
  • 将代码分解为更多的功能使其更可重用且更易于测试。
  • 我测试了使用 @patch(“ builtins.input”,side\_effect = ['a',10,2,'q'] 的交互模式模拟 input 的方法。 side\_effect 中的列表包含将“double” input 的参数。这等效于以下内容(在键入 tree 之后。):

$ emo


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

tree.
1 🎄
2 🌳
3 🌲
4 🌴
5 🎋
Select the number of the emoji you want: a
a is not an integer.
1 🎄
2 🌳
3 🌲
4 🌴
5 🎋
Select the number of the emoji you want: 10
10 is not a valid option.
1 🎄
2 🌳
3 🌲
4 🌴
5 🎋
Select the number of the emoji you want: 2
Copying 🌳 to clipboard


Type one or more emoji related words ...
End a word with a . if you want to select an emoji if there are multiple
matches, otherwise the first match will be picked. Type 'q' to exit.

q
Bye

  • 测试代码时,一种有用的技术是删除所有常见的前导空白。您可以为此使用 textwrap.dedent ,但是在这里我使用了替代的 inspect.cleandoc

上传到PyPI

感谢 toml 文件中 [tool.poetry] 中的一些基本元数据,发布到PyP非常简单:

poetry build
poetry publish

(首先使用 --repository of publish 在测试PyPI上尝试一下,看是否一切正常。)

如果您喜欢这个项目,请在Github上给它加星标,很高兴能收到反馈。

https://github.com/PyBites-Open-Source/emojisearcher

更多阅读

用 Python 进行 OCR 图像识别

用 XGBoost 进行时间序列预测

5 分钟快速上手 pytest 测试框架

特别推荐

picture.image

picture.image

点击下方阅读原文加入 社区会员

0
0
0
0
评论
未登录
暂无评论