리플렉션을 통한 Python 환경 변수

브렌트 아리아

Python 3.7에서는 Environment리플렉션을 통해 OS 환경 변수를로드 할 수 있는 도우미 클래스를 작성했습니다 . 또한 파생 클래스에서 선언 된 형식 힌트를 기반으로 환경 변수를 네이티브 bool 또는 튜플로 변환합니다.

작동하지만 Visual Studio Code의 linter는이 문제 보고서를 제공합니다.

수업 'Environment''__annotations__'구성원 이 없습니다.

다음은 도우미 클래스입니다.

import os
from abc import ABC

class Environment(ABC):

    @classmethod
    def from_os(cls):
        convert = {
            bool: lambda d: d == "1",
            (): lambda d: tuple(d.split(',')),
            str: lambda d: d
        }
        values = [ 
            convert[value](os.environ[key]) 
            for key,value in cls.__annotations__.items() 
            ]
        return cls(*values)

다시 말하지만 코드는 실제로 작동합니다. Pylint를 행복하게하려면 어떻게해야합니까? 를 사용하지 않고 동일한 결과를 얻기 위해 속성 (및 속성 유형 힌트)을 반복 할 수있는 다른 방법이있을 수 있습니다 __annotations__.

속임수를 사용하고 필 린트 억제 힌트를 추가하여 린터가 불평하는 것을 막을 수 있습니다.

   for key,value in cls.__annotations__.items() # pylint: disable=no-member

...하지만 그것은 내가 찾고있는 해결책이 아닙니다.

도움이되는 경우 다음은 내 도우미 클래스를 사용하여 임의의 환경 변수 집합을 가져 오는 방법에 대한 예입니다.

from dataclasses import dataclass

@dataclass
class FWMonitoringEnv(Environment):
    # The names of these attributes are used
    # to find and load a corresponding environment variable.
    # This happens when "FWMonitoringEnv.from_os()" is called.
    preempt : bool
    split_routes : bool
    tag_key : str
    vpc_summary_route : str
    route_table_id : str
    fw_trust_enis : ()
    fw_mgmt_ips : ()
    api_key_name : str
    region : str

코드의 다른 곳에서는 간단히 다음을 실행합니다.

env = FWMonitoringEnv.from_os()

그 동안 수정하고 싶은 또 다른 코드 위생 문제가 있습니다. Environment클래스가 파생 클래스를 강제로 만들 수있는 방법 @dataclass있습니까? 예를 들어, Python 3.7 유형 힌트로 수행 할 수 있습니까?

알렉산드르 슈리 긴

https://docs.python.org/3/library/inspect.html#inspect.signature 메서드를 사용 하여 모든 클래스 주석을 가져올 수 있습니다 .

pprint(inspect.signature(cls).parameters)

mappingproxy(OrderedDict([('preempt', <Parameter "preempt: bool">),
                          ('split_routes', <Parameter "split_routes: bool">),
                          ('tag_key', <Parameter "tag_key: str">),
                          ('vpc_summary_route',
                           <Parameter "vpc_summary_route: str">),
                          ('route_table_id', <Parameter "route_table_id: str">),
                          ('fw_trust_enis', <Parameter "fw_trust_enis: ()">),
                          ('fw_mgmt_ips', <Parameter "fw_mgmt_ips: ()">),
                          ('api_key_name', <Parameter "api_key_name: str">),
                          ('region', <Parameter "region: str">)]))

코드에 통합되면 다음과 같이 보입니다.

    def from_os(cls):
        convert = {
            bool: lambda d: d == '1',
            (): lambda d: tuple(d.split(',')),
            str: lambda d: d
        }
        values = [ 
            convert[val.annotation](os.environ[val.name]) 
            for val in signature(cls).parameters.values()
            ]
        return cls(*values)

나는 그것이 "진정한"방법을 얻는 더 나은 방법이라고 믿는다 :-)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

리플렉션을 통해 변경 불가능한 스칼라 클래스 필드 수정

분류에서Dev

환경을 통해 변수 전달

분류에서Dev

암시 적 변환을 통한 Python Pandas 정수 정밀도 손실

분류에서Dev

Python : 다양한 출력 섹션을 별도의 변수로 리디렉션

분류에서Dev

Unity 애플리케이션 런처에 대한 환경 변수 설정

분류에서Dev

간단한 프로세스 간 통신을 위해 환경 변수 사용

분류에서Dev

세션 별 환경 변수 설정을 통합 한 배치 파일을 실행하는 자바 스크립트

분류에서Dev

함수에서 파이프 라인을 통해 에코를 리디렉션 할 때 환경 변수가 설정되지 않음

분류에서Dev

forcedomain (node.js, express)의 환경 변수를 통해 포트를 설정할 때 루프 리디렉션

분류에서Dev

Scala에서 변경 가능한 컬렉션을 변경 불가능한 컬렉션으로 변환

분류에서Dev

Python 변경 디렉토리가 이상한 오류를 반환합니다.

분류에서Dev

활동 변경을 통한 매개 변수

분류에서Dev

SSH를 통해 한 번에 파일 및 디렉토리 권한을 어떻게 변경할 수 있습니까?

분류에서Dev

리플렉션을 사용하여 Long.MIN_VALUE 변경

분류에서Dev

환경을 통한 ssh 옵션

분류에서Dev

Snap과 APT를 통해 애플리케이션을 설치 한 경우 현재 실행중인 애플리케이션을 어떻게 알 수 있습니까?

분류에서Dev

리플렉션을 통해 검색된 객체를 문자열로 변환 (여러 클래스 유형을 반복하는 방법은 무엇입니까?)

분류에서Dev

Windows7 (+)에 env 또는 이와 동등한 기능이 있습니까? (단일 애플리케이션 실행을위한 환경 변수)

분류에서Dev

Windows에서 Python 가상 환경을 활성화 할 때 환경 변수 설정

분류에서Dev

Dotnet core-동일한 서버의 애플리케이션 (프로세스) 별 환경 변수

분류에서Dev

attr ()은 익명 함수를 통해 반환하지 않는 한 속성을 변경하지 않습니다.

분류에서Dev

Shebang을 통해 nix에서 환경 변수 설정

분류에서Dev

Docker 실행을 Python Docker로 변환, 환경 변수 전달 문제

분류에서Dev

여러 쿼리를 통한 Python SQL 루프 변수

분류에서Dev

Scala에서 리플렉션을 통해 생성자 매개 변수 수 및 유형 결정

분류에서Dev

리플렉션을 통해 인수에 매개 변수가있는 메서드 호출 C #

분류에서Dev

Android 애플리케이션을위한 PDF를 APK로 변환

분류에서Dev

파일 확장자 변경을 통한 오디오 변환 (E-AC3)

분류에서Dev

전역 변수`environ`을 통해 액세스 할 수있는 문자열이 환경에 대한 변경 사항을 반영하지 않습니까?

Related 관련 기사

  1. 1

    리플렉션을 통해 변경 불가능한 스칼라 클래스 필드 수정

  2. 2

    환경을 통해 변수 전달

  3. 3

    암시 적 변환을 통한 Python Pandas 정수 정밀도 손실

  4. 4

    Python : 다양한 출력 섹션을 별도의 변수로 리디렉션

  5. 5

    Unity 애플리케이션 런처에 대한 환경 변수 설정

  6. 6

    간단한 프로세스 간 통신을 위해 환경 변수 사용

  7. 7

    세션 별 환경 변수 설정을 통합 한 배치 파일을 실행하는 자바 스크립트

  8. 8

    함수에서 파이프 라인을 통해 에코를 리디렉션 할 때 환경 변수가 설정되지 않음

  9. 9

    forcedomain (node.js, express)의 환경 변수를 통해 포트를 설정할 때 루프 리디렉션

  10. 10

    Scala에서 변경 가능한 컬렉션을 변경 불가능한 컬렉션으로 변환

  11. 11

    Python 변경 디렉토리가 이상한 오류를 반환합니다.

  12. 12

    활동 변경을 통한 매개 변수

  13. 13

    SSH를 통해 한 번에 파일 및 디렉토리 권한을 어떻게 변경할 수 있습니까?

  14. 14

    리플렉션을 사용하여 Long.MIN_VALUE 변경

  15. 15

    환경을 통한 ssh 옵션

  16. 16

    Snap과 APT를 통해 애플리케이션을 설치 한 경우 현재 실행중인 애플리케이션을 어떻게 알 수 있습니까?

  17. 17

    리플렉션을 통해 검색된 객체를 문자열로 변환 (여러 클래스 유형을 반복하는 방법은 무엇입니까?)

  18. 18

    Windows7 (+)에 env 또는 이와 동등한 기능이 있습니까? (단일 애플리케이션 실행을위한 환경 변수)

  19. 19

    Windows에서 Python 가상 환경을 활성화 할 때 환경 변수 설정

  20. 20

    Dotnet core-동일한 서버의 애플리케이션 (프로세스) 별 환경 변수

  21. 21

    attr ()은 익명 함수를 통해 반환하지 않는 한 속성을 변경하지 않습니다.

  22. 22

    Shebang을 통해 nix에서 환경 변수 설정

  23. 23

    Docker 실행을 Python Docker로 변환, 환경 변수 전달 문제

  24. 24

    여러 쿼리를 통한 Python SQL 루프 변수

  25. 25

    Scala에서 리플렉션을 통해 생성자 매개 변수 수 및 유형 결정

  26. 26

    리플렉션을 통해 인수에 매개 변수가있는 메서드 호출 C #

  27. 27

    Android 애플리케이션을위한 PDF를 APK로 변환

  28. 28

    파일 확장자 변경을 통한 오디오 변환 (E-AC3)

  29. 29

    전역 변수`environ`을 통해 액세스 할 수있는 문자열이 환경에 대한 변경 사항을 반영하지 않습니까?

뜨겁다태그

보관