>source

다음 code를 고려하십시오.

class SomeClass:
    def __init__(self, config):
        for key, value in config.items():
            self.__setattr__(key, value)
    def foo(self):
        print(self.a)

PyCharm 2017.1.1에서 확인되지 않은 속성에 대해 경고합니다.그리고 나는 그것에 절대적으로 동의합니다. 그러나 생성자에서 속성의 덩어리를 작성하고 싶지 않습니다.

경고 없이 동일한 기능을 작성하는 해결 방법이 있습니까? 또는 최소한 이 특정 클래스의 속성에 대해 경고하지 않도록 PyCharm에 알릴 수 있습니까?

  • 답변 # 1

    동적 속성 정의가 좋지 않다는 사실에 동의합니다. 최소한 확실한 속성 집합이 알려진 경우 유형 정의를 사용할 수 있습니다.

    class SomeClass:
        a: str
        def __init__(self, config):
            for key, value in config.items():
                self.__setattr__(key, value)
        def foo(self):
            print(self.a)
    

    그래도 한 클래스에 대한 모든 속성 참조에 대해 PyCharm(최소한 최신 버전에서는) 경고를 비활성화하려면 다음을 정의할 수 있습니다.__getattr__방법.

    class SomeClass:
        def __init__(self, config):
            for key, value in config.items():
                self.__setattr__(key, value)
        def __getattr__(self, name: str):
            return self.__dict__[name]
            # return super().__getattr__(name)  # it works but causes a PyCharm warning
        def foo(self):
            print(self.a)
    # Verification
    config= {"a" : "b"}
    instance= SomeClass(config)
    print(instance.a)
    instance.foo()
    

  • 답변 # 2

    당신은 그것을 기쁘게 하기 위해 이것을 할 수 있습니다:

    def foo(self):
        if hasattr(self, 'a'):
            print(self.a)
    

    편집: 경고, 이것은 나쁜 생각입니다! 그러나 pycharm Preferences > 에디터 > 검사하고 Python 섹션에서 '확인되지 않은 참조' 확인을 비활성화합니다. 이렇게 하면 pycharm이 오류를 무시하게 되지만 나쁜 일입니다.

    나는 많은 속성을 가지고 있으며 속성 초기화를 많이 작성하지 않으려고 노력하고 있습니다. 대신 if 문을 많이 작성하는 것이 좋습니다. 아니요 괜찮습니다.

    RomanS2022-02-05 23:43:25

    @RomanS 나는 당신이 이것을하고 싶어하는 많은 속성을 가지고 있다는 것을 깨닫지 못했습니다. 속성 이름의 문자열을 사용하는 단일 메서드가 작동합니까? 따라서 attr이 존재하는지 확인한 다음 인쇄합니까? 아니면 각각 다른 작업을 수행해야 합니까?

    dheiberg2022-02-05 23:43:25

    첫 번째 게시물을보십시오. 인용문: "하지만 생성자에 속성 블롭을 작성하고 싶지 않습니다." 그래서 config: dict가 있습니다. 예를 들어 yaml/json/etc 파일에서 읽습니다. 그리고 그 간단한 루프를 사용하여 이러한 구성 옵션 값을 개체 속성에 할당할 수 있습니다. 그리고 나는 그것들을 일부 객체 메소드에서 모두 사용할 것입니다. foo 메소드는 단일 속성에서만 작동하도록 설계되었지만 모든 속성을 사용해야 합니다.

    RomanS2022-02-05 23:43:25

    나는이 사실을 알고. 그러나 당신은 완전히 옳습니다. 그것은 나쁜 생각입니다 :) 한 수업에 대해서만 그것을 끌 수있는 기회가 있다면 좋을 것입니다 ...

    RomanS2022-02-05 23:43:25
  • 이전 python : 루프 혼란을 위한 파이썬
  • 다음 algorithm : 서로 멀리 떨어져 있는 요소가 있는 부분집합 찾기