假定db1, db2 是shelve对象
if switch_d1_and_db2:
func(db1, db2)
else:
func(db2, db1)
怎么才能改写成:
if switch_d1_and_db2:
db1, db2 = db2, db1 # 错误写法
func(db1, db2)
db1, db2 = db2, db1
肯定是不行的,怎么改写呢
高洛峰2017-04-18 09:18:15
안녕하세요. 이 문제에 대해 한동안 연구한 끝에 내린 결론은 다음과 같습니다.
하기가 너무 어렵고 사용하려는 구문이 수행하려는 작업과 일치하지 않습니다
원래의 방법을 사용해도 문제가 없다고 생각합니다
당신이 정의한 교환을 달성하고 싶다면 너무 아름답지 않은 대안이 있습니다.
다음은 위의 세 가지 사항에 대한 설명입니다.
첫 번째로 원하는 점은 다음과 같습니다.
으아악db1
, db2
가 어떤 객체이든 간에 이 교환의 의미는
db1
변수는db2
에서 원래 참조한 개체를 참조하고,db2
변수는db1
에서 원래 참조한 개체를 참조하도록 합니다.
하지만 당신이 하고 싶은 일은:
db1
파일과db2
파일의 내용을 바꾸도록 합니다
잘 생각해 보세요. 이 두 가지는 동일하지 않습니다. 다시 말하면 db1, db2 = db2, db1
은 변수에서 참조하는 것만 변경합니다(변수 이름은 db의 파일 이름과 동일하지 않습니다). , 그러나 각 파일의 이름은 아직 내용이 교환되지 않습니다.
따라서 이 구문을 사용하여 교환하는 것은 달성하려는 효과와 일치하지 않습니다.
두 번째 사항은 타당하므로 자세히 설명하지 않겠습니다만, 마음에 들지 않으실 수도 있습니다.
제가 제시한 세 번째 요점은 덜 아름다운 대안으로, shelf
의 프록시 클래스 ShelfProxy
를 간단히 정의하는 것입니다. 이 클래스는 Shelf
클래스의 동작을 시뮬레이션하려고 합니다(인터페이스만 유사합니다). , 오버로드된 연산자 ^
는 교환으로 정의됩니다:
저는 ^
에서 의 내용을 교환하는 것으로 정의합니다. 를 선택한 이유는 단지 더 적합한 기호가 생각나지 않기 때문입니다. 이렇게 하면 다른 클래스의 인스턴스가 반환되기 쉽지 않지만 편의를 위해 그리고 간단한 인터페이스를 원하기 때문에 이렇게 만들었습니다. ^
으아악
테스트 코드:으아악
결과:으아악
결론과 동일한 인터페이스를 사용하여 Shelf
을 조작하면 되고, 전체적인 효과는 비슷하지만, 너무 많이 쓰고 나면 처음부터 그 방법을 사용하는 것이 더 쉽다고 생각하지 않나요? ?XDShelfProxy
내가 답변한 질문: Python-QA