방금 Pycharm으로 전환했으며 코드를 개선하는 데 도움이되는 모든 경고와 힌트에 매우 만족합니다. 내가 이해하지 못하는 것을 제외하고 :
This inspection detects shadowing names defined in outer scopes.
외부 범위에서 변수에 액세스하는 것은 나쁜 습관이지만 외부 범위를 음영 처리하는 데 어떤 문제가 있습니까?
다음은 Pycharm이 경고 메시지를 표시하는 예입니다.
data = [4, 5, 6]
def print_data(data): # <-- Warning: "Shadows 'data' from outer scope
print data
print_data(data)
답변
위의 스 니펫에는 별다른 문제가 없지만 몇 가지 인수와 코드 줄이 더 많은 함수를 상상해보십시오. 그런 다음 data
인수의 이름을 바꾸려고 yadda
하지만 함수 본문에서 사용되는 위치 중 하나를 그리워합니다 … 이제 data
전역을 참조하고 이상한 행동을 시작합니다- NameError
그렇지 않은 경우 훨씬 더 분명한 위치 글로벌 이름이 data
있습니다.
또한 파이썬에서는 모든 것이 객체 (모듈, 클래스 및 함수 포함)이므로 함수, 모듈 또는 클래스에 대한 명확한 네임 스페이스가 없다는 것을 기억하십시오. 또 다른 시나리오는 foo
모듈 상단에서 함수를 가져 와서 함수 본문 어딘가에서 사용하는 것입니다. 그런 다음 함수에 새로운 인수를 추가하고 이름을 “불운”으로 지정했습니다 foo
.
마지막으로 내장 함수와 형식도 같은 네임 스페이스에 존재하며 같은 방식으로 음영 처리 될 수 있습니다.
함수가 짧고, 이름이 좋고, 적절한 단위 테스트 범위가 있다면이 중 어느 것도 문제가되지 않지만, 때로는 완벽한 코드보다 적게 유지하고 그러한 가능한 문제에 대해 경고를받는 것이 도움이 될 수 있습니다.
답변
현재 가장 많이지지되고 승인 된 답변 과 여기에있는 대부분의 답변이 요점을 놓칩니다.
함수의 길이 또는 변수의 이름을 설명 적으로 지정하는 것은 중요하지 않습니다 (이름 충돌 가능성을 최소화하기 위해).
함수의 지역 변수 또는 매개 변수가 전역 범위에서 이름을 공유한다는 사실은 전혀 관련이 없습니다. 사실, 지역 변수 이름을 아무리 신중하게 선택하더라도 함수는 “내 멋진 이름인지 여부를 예측할 수 없습니다”yadda
이 나중에 전역 변수로 사용 . 해결책? 그것에 대해 걱정하지 마십시오! 올바른 사고 방식은 signature의 매개 변수에서만 입력을 사용하도록 함수를 설계 하는 것입니다. 그러면 전역 범위의 내용을 신경 쓸 필요가 없으며 섀도 잉은 전혀 문제가되지 않습니다.
즉, 섀도 잉 문제는 함수가 동일한 이름의 로컬 변수와 전역 변수를 사용해야하는 경우에만 중요합니다. 그러나 처음에는 그러한 디자인을 피해야합니다. OP의 코드에는 실제로 그러한 디자인 문제가 없습니다. PyCharm이 충분히 똑똑하지 않고 단지 경우를 대비하여 경고를합니다. 따라서 PyCharm을 행복하게 만들고 코드를 깨끗하게 만들려면 silyevsk의 답변 에서 인용 한이 솔루션을 참조하십시오 려면 전역 변수를 완전히 제거하는 .
def print_data(data):
print data
def main():
data = [4, 5, 6]
print_data(data)
main()
이것은 현재 로컬 기능을 조정하지 않고 전역을 수정 / 제거하여이 문제를 “해결”하는 올바른 방법입니다.
답변
경우에 따라 좋은 해결 방법은 vars + 코드를 다른 함수로 옮기는 것입니다.
def print_data(data):
print data
def main():
data = [4, 5, 6]
print_data(data)
main()
답변
기능의 길이에 따라 다릅니다. 함수가 길수록 미래에 누군가 수정 data
하면 글로벌을 의미한다고 생각할 가능성이 높아집니다 . 사실 그것은 로컬을 의미하지만 함수가 너무 길기 때문에 그 이름을 가진 로컬이 존재한다는 것은 분명하지 않습니다.
예제 함수의 경우 전역 그림자를 만드는 것이 전혀 나쁘지 않다고 생각합니다.
답변
이 작업을 수행:
data = [4, 5, 6]
def print_data():
global data
print(data)
print_data()
답변
data = [4, 5, 6] #your global variable
def print_data(data): # <-- Pass in a parameter called "data"
print data # <-- Note: You can access global variable inside your function, BUT for now, which is which? the parameter or the global variable? Confused, huh?
print_data(data)
답변
나는 pycharm의 오른쪽 상단에 녹색 틱을보고 싶습니다. 중요한 경고에 집중할 수 있도록이 경고를 지우려면 변수 이름에 밑줄을 추가하십시오.
data = [4, 5, 6]
def print_data(data_):
print(data_)
print_data(data)
