2010-08-10 3 views
5

내 응용 프로그램에 대한 unittest 모듈을 사용하여 일부 단위 테스트를 작성 중이며 호출하는 메서드가 "파일과 같은"개체를 반환하는지 확인할 수있는 무언가를 작성하려고합니다. 이것은 단순한 isinstance 호출이 아니기 때문에이를 결정하는 최선의 방법이 무엇인지 궁금합니다.파이썬 : 객체가 파일과 같은지 판단 할 수 있습니까?

그래서, 개요에서 :

possible_file = self.dao.get_file("anotherfile.pdf") 
self.assertTrue(possible_file is file-like) 

는 아마도 내가 어떤 특정 인터페이스는 파일과 같은 I 지원할 수 있도록이 파일 객체 구현, 또는 방법을 걱정해야? 반환 된 객체는 인터페이스를 제공하는 경우

감사합니다,

R

답변

2

확인, 당신이 찾고 있습니다. 예를 들어 다음과 같이 :

self.assert_(hasattr(possible_file, 'write')) 
self.assert_(hasattr(possible_file, 'read')) 
+1

원하지 않는 한이 작업을 수행하지 마십시오. – katrielalex

+0

그래, 그러지 않을거야. 그러나 그는 뭔가가 파일인지, 파일로 사용하지 않는지 확인하는 방법을 요청했습니다. – gruszczy

4

고전 파이썬 정신은 권한보다 용서를 물어 쉽다는 것이다. 즉, 확인하지 말고 write으로 인한 예외를 잡으십시오.

새로운 방법은 isinstance 수표에 IO abstract base class을 사용하는 것입니다. 이것은 사람들이 오리 타이핑이 굉장하다는 것을 알았을 때 도입되었지만 때로는 인스턴스 체크를 원할 때도 있습니다. 귀하의 경우 (유닛 테스트)에서

, 당신은 아마 그것을 시도하고보고 싶어 :

thingy = ... 
try: 
    thingy.write(...) 
    thingy.writeline(...) 
    ... 
    thingy.read() 
except AttributeError: 
    ... 
+2

파일에 쓰려고하면 단위 테스트 컨텍스트에서 적합하지 않을 수 있습니다. –

+0

클래식 및 르네상스 사고 패턴 +1 +1 –

+0

@Ned : 정말? 파일과 같은 클래스를 구현하는 경우 반드시 그 클래스가 제공하는 것을 적어 놓는다는 것을 테스트해야합니다. 하지만 정말로 원하지 않으면'hasattr '을 사용할 수 있습니다. – katrielalex

7

개체가 "충분히 파일 같은"무엇의 어떤 "공식적인 정의"없다의 다양한 사용하기 때문에 파일과 같은 객체는 다른 요구 사항을 가지고 있습니다. 예를 들어, 일부는 read 또는 write 메소드를 필요로하며, 다른 메소드는 다양한 라인 읽기 메소드의 일부 서브 세트를 필요로합니다 ... 모든 방법은 fileno 메소드를 필요로합니다. 표준 라이브러리에있는 StringIOcStringIO 모듈에 의해 제공되는 "매우 파일과 유사한 객체"가 제공합니다. 그것은 분명히 "회색 음영"의 질문입니다. 아니요 흑백 분류!

따라서 어떤 방법이 인지 확인해야합니다.이 필요합니다. 그것들을 확인하기 위해서 나는 FileLikeEnoughForMeabstract base classabstractmethod 데코레이터로 정의하고, Python 2.6 이상을 사용하고 있다면 해당 클래스에 대해 isinstance으로 객체를 검사 할 것을 권장했다. 요즘은 이런 것들을 권장하지 않는다. hasattr은 덜 읽기 쉽고 더 복잡한 검사를합니다 (실제로 속성을 검사하는 등의 방법으로 적절하게 강화 된 경우 등).

+0

안녕하세요 알렉스, 포인터 주셔서 감사합니다,이 재미있는 물건, 아직 내 머리 주위에지고있다. 당신은 unittest 용으로 이것을 사용 하시겠습니까? 아니면 이것이 응용 프로그램 내에서 파일과 같은 객체를 관리하는 일반적인 접근 방식이어야합니까? –

+0

@ 리차드, 저는 파이썬에서 ABC를 사용하는 것만으로도 "습득하기가 쉽지 않습니다"(Haskell typeclasses, C++의 추상 기본 클래스, Java 인터페이스 등과의 유추가 나를 도울 수는 있지만 ;-) 그래서 나는 ' 그러한 맥락에서 굳이 추천하거나 그렇지 않은 경우. 나는 그들이 매우 잘 알 것이다. (나는 아주 잘 알고있는 대안으로 비유한다.) 그러나 나는 그들과 함께 "내 허리띠 아래"와 같이 좀 더 실제적인 싸움이 필요하다. 그러나 테스트 목적으로, 나는 그들이 "고양이의 잠옷", 즉 우수하고 유용하다는 것을 이미 알고 있습니다. –

+0

arg - 주석에 코드 마크 업이 없습니다! –

관련 문제