社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用 Python 开发 emoji 表情查找程序

Python中文社区 • 3 年前 • 412 次点击  

今天分享一个前几天构建的小应用程序,用来从命令行搜索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 测试框架

特别推荐




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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/114075
 
412 次点击