搜索
首页后端开发Python教程软件工程师访谈 - #EIS CLI

Software Engineer Interviews - #EIS CLI

介绍

这是软件工程师访谈系列的第三篇文章。我带来了几年前做过的挑战,并且实际上得到了这个职位 - 涉及其他技术面试,例如过去的经验筛选。

如果您错过了本系列之前的帖子,可以在这里找到它们。

挑战

这个挑战也是一项带回家的编码任务,我必须开发一个 CLI 程序来查询 OEIS(整数序列在线百科全书)并返回结果总数以及第一个结果的名称查询返回五个序列。

值得庆幸的是,OEIS 查询系统包含 JSON 输出格式,因此您可以通过调用 url 并将序列作为查询字符串传递来获取结果。

输入和输出示例:

oeis 1 1 2 3 5 7
Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).

注意:此结果已过时!

解决挑战

解决这一挑战的计划如下:

  • 从将作为 CLI 入口点的 Python 文件开始
    • 它应该接收一个由空格分隔的数字列表作为参数
  • 创建一个客户端文件,负责从 OEIS 查询系统获取数据
  • 一个格式化程序,负责返回为控制台格式化的输出

由于这是一个编码挑战,我将使用 Poetry 来帮助我创建项目的结构,并方便任何人运行它。您可以在他们的网站上查看如何安装和使用 Poetry。

我将首先使用以下内容创建包:

poetry new oeis

这将创建一个名为 oeis 的文件夹,其中包含 Poetry 的配置文件、一个测试文件夹和一个也称为 oeis 的文件夹,该文件夹将成为我们项目的根目录。

我还将添加一个名为 Click 的可选包,它有助于构建 CLI 工具。这不是必需的,可以用 Python 中的其他本机工具替换,尽管不太优雅。

在项目文件夹中,运行:

poetry add click

这会将 click 添加为我们项目的依赖项。

现在我们可以移动到入口点文件。如果你打开文件夹 oeis/oeis,你会看到已经有一个 __init__.py 文件。让我们更新它以导入 Click,以及使用以下命令调用的主函数:

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()

这是我们 CLI 的起点。看到@click.command了吗?这是来自 click 的包装器,它将帮助我们将 oeis 定义为命令。

现在,还记得我们需要接收以空格分隔的数字序列吗?我们需要将其添加为参数。 Click 有一个选项:

oeis 1 1 2 3 5 7

这将添加一个名为序列的参数,并且 nargs=-1 选项告诉单击它将用空格分隔。我添加了一个打印,以便我们可以测试参数是否正确传递。

为了告诉 Poetry 我们有一个命令,我们需要打开 pyproject.toml 并添加以下行:

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).

这是添加一个名为 oeis 的脚本,该脚本调用 oeis 模块上的 oeis 函数。现在,我们运行:

poetry new oeis

这将让我们调用脚本。我们来尝试一下:

poetry add click

完美,我们已经按照我们的预期解析了命令和参数!让我们继续讨论客户端。在oeis/oeis文件夹下,创建一个名为clients的文件夹、一个名为__init__.py的文件和一个名为oeis_client.py的文件。

如果我们期望在这个项目中拥有其他客户端,我们可以开发一个基本客户端类,但由于我们只有这一个,所以这可能被认为是过度设计。在 OEIS 客户端类中,我们应该有一个基本 URL,这是没有路径的 URL,我们将使用它来查询它:

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()

如您所见,我们正在导入 requests 包。我们需要将它添加到 Poetry 中才能使用它:

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()

现在,客户端有一个不会改变的基本 URL。让我们深入研究其他方法:

  • 构建网址参数
    • 接收从 CLI 作为参数传递的序列,并将其转换为以逗号分隔的数字字符串
    • 使用参数构建一个字典,q 是我们将运行的查询,fmt 是预期的输出格式
    • 最后,我们返回参数的 URL 编码版本,这是确保我们的字符串与 URL 兼容的好方法
  • 查询结果
    • 接收从 CLI 作为参数传递的序列,通过 build_url_params 方法构建 url 编码的参数
    • 构建将用于查询数据的完整 URL
    • 继续向构建的 URL 发出请求,并引发我们未预料到的任何 HTTP 状态
    • 返回 JSON 数据

我们还需要更新我们的主文件,以调用此方法:

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"

这里我们现在在方法外部构建一个客户端实例,因此它不会在每次调用命令时都创建一个实例,而是在命令内部调用它。

运行此命令会产生非常非常长的响应,因为 OEIS 有数千个条目。由于我们只需要知道总大小和前五个条目,因此我们可以执行以下操作:

poetry install

运行这个已经比以前好多了。我们现在打印总大小以及前五个(如果存在)条目。

但我们也不需要所有这些。让我们构建一个格式化程序来正确格式化我们的输出。创建一个名为 formatters 的文件夹,其中包含 __init__.py 文件和 oeis_formatter.py 文件。

oeis 1 1 2 3 5 7

该文件基本上将前五个结果格式化为我们想要的输出。让我们在主文件中使用它:

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).

如果您运行此代码,您现在将得到:

poetry new oeis

它现在以我们期望的格式返回,但请注意它说找到了 10 个结果。这是错误的,如果您在 OEIS 网站上搜索,您会看到更多结果。不幸的是,OEIS API 进行了更新,结果不再返回包含结果数量的计数。不过,该计数仍然显示在文本格式的输出中。我们可以用它来知道有多少个结果。

为此,我们可以更改 URL 以使用 fmt=text 和正则表达式来查找我们想要的值。让我们更新客户端代码以获取文本数据,并更新格式化程序以使用此数据,以便我们可以输出它。

poetry add click

如您所见,我们添加了两个新方法:

  • 获取计数
    • 将为文本 API 构建参数,并将其传递给使用正则表达式查找我们正在搜索的数字的方法
  • 获取响应计数
    • 将使用类 init 中内置的正则表达式来执行搜索并获取第一组
# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()

在这个文件中,我们只为方法添加了一个新的参数,并用它代替了查询结果的长度。

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()

这里我们只是在客户端调用新方法,并将信息传递给格式化程序。再次运行它会产生我们期望的输出:

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"

代码已经基本准备好了。但对于真正的挑战,请记住尽可能使用 Git,进行小型提交,当然,添加单元测试、代码格式化库、类型检查器以及您认为需要的任何其他内容。

祝你好运!

以上是软件工程师访谈 - #EIS CLI的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python:深入研究汇编和解释Python:深入研究汇编和解释May 12, 2025 am 12:14 AM

pythonisehybridmodelofcompilationand interpretation:1)thepythoninterspretercompilesourcececodeintoplatform- interpententbybytecode.2)thepytythonvirtualmachine(pvm)thenexecuteCutestestestesteSteSteSteSteSteSthisByTecode,BelancingEaseofuseWithPerformance。

Python是一种解释或编译语言,为什么重要?Python是一种解释或编译语言,为什么重要?May 12, 2025 am 12:09 AM

pythonisbothinterpretedAndCompiled.1)它的compiledTobyTecodeForportabilityAcrosplatforms.2)bytecodeisthenInterpreted,允许fordingfordforderynamictynamictymictymictymictyandrapiddefupment,尽管Ititmaybeslowerthananeflowerthanancompiledcompiledlanguages。

对于python中的循环时循环与循环:解释了关键差异对于python中的循环时循环与循环:解释了关键差异May 12, 2025 am 12:08 AM

在您的知识之际,而foroopsareideal insinAdvance中,而WhileLoopSareBetterForsituations则youneedtoloopuntilaconditionismet

循环时:实用指南循环时:实用指南May 12, 2025 am 12:07 AM

ForboopSareSusedwhenthentheneMberofiterationsiskNownInAdvance,而WhileLoopSareSareDestrationsDepportonAcondition.1)ForloopSareIdealForiteratingOverSequencesLikelistSorarrays.2)whileLeleLooleSuitableApeableableableableableableforscenarioscenarioswhereTheLeTheLeTheLeTeLoopContinusunuesuntilaspecificiccificcificCondond

Python:它是真正的解释吗?揭穿神话Python:它是真正的解释吗?揭穿神话May 12, 2025 am 12:05 AM

pythonisnotpuroly interpred; itosisehybridablectofbytecodecompilationandruntimeinterpretation.1)PythonCompiLessourceceCeceDintobyTecode,whitsthenexecececected bytybytybythepythepythepythonvirtirtualmachine(pvm).2)

与同一元素的Python串联列表与同一元素的Python串联列表May 11, 2025 am 12:08 AM

concateNateListsinpythonwithTheSamelements,使用:1)operatototakeepduplicates,2)asettoremavelemavphicates,or3)listCompreanspearensionforcontroloverduplicates,每个methodhasdhasdifferentperferentperferentperforentperforentperforentperfortenceandordormplications。

解释与编译语言:Python的位置解释与编译语言:Python的位置May 11, 2025 am 12:07 AM

pythonisanterpretedlanguage,offeringosofuseandflexibilitybutfacingperformancelanceLimitationsInCricapplications.1)drightingedlanguageslikeLikeLikeLikeLikeLikeLikeLikeThonexecuteline-by-line,允许ImmediaMediaMediaMediaMediaMediateFeedBackAndBackAndRapidPrototypiD.2)compiledLanguagesLanguagesLagagesLikagesLikec/c thresst

循环时:您什么时候在Python中使用?循环时:您什么时候在Python中使用?May 11, 2025 am 12:05 AM

Useforloopswhenthenumberofiterationsisknowninadvance,andwhileloopswheniterationsdependonacondition.1)Forloopsareidealforsequenceslikelistsorranges.2)Whileloopssuitscenarioswheretheloopcontinuesuntilaspecificconditionismet,usefulforuserinputsoralgorit

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能