> 백엔드 개발 > 파이썬 튜토리얼 > 소프트웨어 엔지니어 인터뷰 - #EIS CLI

소프트웨어 엔지니어 인터뷰 - #EIS CLI

Linda Hamilton
풀어 주다: 2024-11-29 04:55:10
원래의
847명이 탐색했습니다.

Software Engineer Interviews - #EIS CLI

소개

소프트웨어 엔지니어 인터뷰 시리즈 세 번째 포스팅입니다. 몇 년 전에 했던 도전 과제를 들고 실제로 입사하게 됐어요. 과거 경력 심사 등 다른 기술 면접도 참여했어요.

이 시리즈의 이전 게시물을 놓치셨다면 여기에서 찾아보실 수 있습니다.

도전

이번 챌린지는 집에서 하는 코딩 작업이기도 했습니다. OEIS(On-Line Encyclopedia of Integer Sequences)에 쿼리하고 총 결과 수와 첫 번째 결과의 이름을 반환하는 CLI 프로그램을 개발해야 했습니다. 쿼리에서 반환된 5개의 시퀀스입니다.

다행히 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
로그인 후 복사
로그인 후 복사
로그인 후 복사

이렇게 하면 Poetry의 구성 파일, 테스트 폴더 및 프로젝트의 루트가 될 oeis라는 폴더가 포함될 oeis라는 폴더가 생성됩니다.

CLI 도구 구축에 도움이 되는 Click이라는 선택적 패키지도 추가하겠습니다. 이는 필수는 아니며 Python의 다른 기본 도구로 대체할 수 있지만 덜 우아합니다.

프로젝트 폴더 내에서 다음을 실행하세요.

poetry add click
로그인 후 복사
로그인 후 복사
로그인 후 복사

이렇게 하면 클릭이 프로젝트에 종속성으로 추가됩니다.

이제 진입점 파일로 이동할 수 있습니다. oeis/oeis 폴더를 열면 이미 __init__.py 파일이 있는 것을 볼 수 있습니다. Click을 가져오고 다음 명령으로 주요 기능을 호출하도록 업데이트해 보겠습니다.

# oeis/oeis/__init__.py

import click


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


if __name__ == "__main__":
    oeis()
로그인 후 복사
로그인 후 복사
로그인 후 복사

이것이 CLI의 시작점입니다. @click.command를 보시겠어요? 이것은 클릭의 래퍼로, 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 폴더 아래에 클라이언트라는 폴더, __init__.py라는 파일 및 oeis_client.py라는 파일을 만듭니다.

이 프로젝트에 다른 클라이언트가 있을 것으로 예상했다면 기본 클라이언트 클래스를 개발할 수 있지만, 이 클라이언트 클래스만 갖게 되므로 과도한 엔지니어링으로 간주될 수 있습니다. OEIS 클라이언트 클래스에는 경로가 없는 URL인 기본 URL이 있어야 하며 이를 쿼리하는 데 사용할 것입니다.

# oeis/oeis/__init__.py

import click


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


if __name__ == "__main__":
    oeis()
로그인 후 복사
로그인 후 복사
로그인 후 복사

보시다시피 요청 패키지를 가져오는 중입니다. 사용하려면 먼저 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이 있습니다. 다른 방법을 살펴보겠습니다.

  • build_url_params
    • CLI에서 인수로 전달된 시퀀스를 받아 쉼표로 구분된 숫자 문자열로 변환합니다
    • 매개변수를 사용하여 사전을 작성합니다. q는 실행할 쿼리이고 fmt는 예상되는 출력 형식입니다.
    • 마지막으로 매개변수의 URL 인코딩 버전을 반환합니다. 이는 문자열이 URL과 호환되는지 확인하는 좋은 방법입니다.
  • 쿼리_결과
    • CLI에서 인수로 전달된 시퀀스를 수신하고, build_url_params 메소드를 통해 URL 인코딩 매개변수를 빌드합니다
    • 데이터를 쿼리하는 데 사용될 전체 URL을 구축합니다
    • 구축된 URL에 대한 요청을 진행하고 예상하지 못한 HTTP 상태를 발생시킵니다
    • JSON 데이터를 반환합니다

이 메서드를 호출하려면 기본 파일도 업데이트해야 합니다.

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"
로그인 후 복사
로그인 후 복사

이제 메소드 외부에서 클라이언트 인스턴스를 구축하므로 명령이 호출될 때마다 인스턴스를 생성하지 않고 명령 내부에서 호출합니다.

OEIS에는 수천 개의 항목이 있기 때문에 이를 실행하면 응답 시간이 매우 길어집니다. 전체 크기와 상위 5개 항목만 알면 되므로 다음을 수행할 수 있습니다.

poetry install
로그인 후 복사

이것을 실행하는 것은 이미 이전보다 훨씬 좋습니다. 이제 전체 크기와 상위 5개 항목(존재하는 경우)이 인쇄됩니다.

하지만 그 모든 것이 필요하지는 않습니다. 출력 형식을 올바르게 지정하는 포맷터를 만들어 보겠습니다. __init__.py 파일과 oeis_formatter.py 파일이 있는 formatters라는 폴더를 만듭니다.

oeis 1 1 2 3 5 7
로그인 후 복사
로그인 후 복사
로그인 후 복사

이 파일은 기본적으로 상위 5개 결과를 우리가 원하는 출력 형식으로 지정합니다. 기본 파일에서 사용해 보겠습니다.

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가 업데이트되어 결과가 더 이상 결과 수와 함께 개수를 반환하지 않습니다. 하지만 이 개수는 텍스트 형식의 출력에 계속 표시됩니다. 이를 사용하여 결과가 몇 개인지 알 수 있습니다.

이를 위해 fmt=text를 사용하도록 URL을 변경하고 정규식을 사용하여 원하는 값을 찾을 수 있습니다. 텍스트 데이터를 가져오기 위한 클라이언트 코드와 이 데이터를 사용하여 출력할 수 있도록 포맷터를 업데이트하겠습니다.

poetry add click
로그인 후 복사
로그인 후 복사
로그인 후 복사

보시다시피 두 가지 새로운 방법을 추가했습니다.

  • get_count
    • 텍스트 API에 대한 매개변수를 구축하고 이를 정규식을 사용하여 검색 중인 숫자를 찾는 메소드에 전달합니다
  • get_response_count
    • 클래스의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿