찾다

 >  Q&A  >  본문

python - 如何交换两个shelve对象?

假定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 肯定是不行的,怎么改写呢

PHPzPHPz2893일 전667

모든 응답(1)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-18 09:18:15

    안녕하세요. 이 문제에 대해 한동안 연구한 끝에 내린 결론은 다음과 같습니다.

    1. 하기가 너무 어렵고 사용하려는 구문이 수행하려는 작업과 일치하지 않습니다

    2. 원래의 방법을 사용해도 문제가 없다고 생각합니다

    3. 당신이 정의한 교환을 달성하고 싶다면 너무 아름답지 않은 대안이 있습니다.

    4. 을 참조하세요.

    다음은 위의 세 가지 사항에 대한 설명입니다.

    첫 번째로 원하는 점은 다음과 같습니다.

    으아악

    db1, db2가 어떤 객체이든 간에 이 교환의 의미는

    입니다.

    db1 변수는 db2에서 원래 참조한 개체를 참조하고, db2 변수는 db1에서 원래 참조한 개체를 참조하도록 합니다.

    하지만 당신이 하고 싶은 일은:

    db1 파일과 db2 파일의 내용을 바꾸도록 합니다

    잘 생각해 보세요. 이 두 가지는 동일하지 않습니다. 다시 말하면 db1, db2 = db2, db1은 변수에서 참조하는 것만 변경합니다(변수 이름은 db의 파일 이름과 동일하지 않습니다). , 그러나 각 파일의 이름은 아직 내용이 교환되지 않습니다.

    따라서 이 구문을 사용하여 교환하는 것은 달성하려는 효과와 일치하지 않습니다.

    두 번째 사항은 타당하므로 자세히 설명하지 않겠습니다만, 마음에 들지 않으실 수도 있습니다.

    제가 제시한 세 번째 요점은 덜 아름다운 대안으로, shelf의 프록시 클래스 ShelfProxy를 간단히 정의하는 것입니다. 이 클래스는 Shelf 클래스의 동작을 시뮬레이션하려고 합니다(인터페이스만 유사합니다). , 오버로드된 연산자 ^는 교환으로 정의됩니다:

    으아악

    저는 ^에서 의 내용을 교환하는 것으로 정의합니다. 를 선택한 이유는 단지 더 적합한 기호가 생각나지 않기 때문입니다. 이렇게 하면 다른 클래스의 인스턴스가 반환되기 쉽지 않지만 편의를 위해 그리고 간단한 인터페이스를 원하기 때문에 이렇게 만들었습니다. ^

    그런 다음 몇 가지 테스트 기능을 정의합니다.

    으아악

    테스트 코드:

    으아악

    결과:

    으아악

    결론

    대부분

    과 동일한 인터페이스를 사용하여 Shelf을 조작하면 되고, 전체적인 효과는 비슷하지만, 너무 많이 쓰고 나면 처음부터 그 방법을 사용하는 것이 더 쉽다고 생각하지 않나요? ?XDShelfProxy


    내가 답변한 질문: Python-QA

    회신하다
    0
  • 취소회신하다