2013-07-10 2 views
2

None과 같은 특별한 싱글 톤을 어떻게 만들까요? (필자는 파이썬에 새로운 해요.)특별한 싱글 톤 (None처럼)

내가 이런 종류의 할 수 있도록하려면 :

def create_mutations(d): 
    return [ 
     Mutation(c, v) 
     if v is not CellAction.Delete else 
     Mutation(c, isDelete=True) 
     for (c, v) in d 
     ] 

과 같이 사용 :이 세 가지를 포함하는 목록을 만들 것입니다

create_mutations({'a': 5, 'b': None, 'c': CellAction.Delete}) 

을 돌연변이는 "a5으로 설정하고 bNone으로 설정하고 c을 삭제하십시오."

점은 "None-b 설정"과 사이에 차이가 없기 때문에 create_mutations의 정의에 내가 ... if v is not None else ...을 사용할 수 없다는 것입니다 "b 삭제가."

질문이 명확하지 않은지 명확히 할 수 있습니다.

Delete = object() 

이 대부분의 경우에 충분하다 :

답변

6

당신은이 같은 모듈 또는 클래스에 object 곳을 인스턴스화 할 수 있습니다.

+0

잘 작동합니다. 클래스를 정의하는 파일의 최상위 레벨에있는 라인을 그냥 덤프 할 수 있다는 것을 깨닫지 못했습니다. –

3

개체를 만들어 이름을 지정하기 만하면됩니다. 마이클 노트로, object 인스턴스를

class Delete: 
    pass 

을 또는 : 빈 클래스는 할 것입니다.

is을 사용하여 테스트하려는 경우 사용하는 개체는 모두 변경 가능해야합니다. 파이썬에는 변경 불가능한 객체의 인스턴스를 공유하는 습관이 있습니다. 예를 들어, 모든 빈 튜플은 같은 객체입니다.

+0

두 답변을 병합하고 DELETE = Delete()와 같은 프로젝트를 보았습니다. –

+0

@JonathanVanasco 그게 무슨 일을합니까? – endolith

+0

'DELETE = object()'와 함께,'foo is DELETE'를 항상 확인해야합니다. DELETE = Delete()를 사용하면 if isinstance (DELETE, Delete)를 사용하여 확인할 수 있습니다. 당신이 작업하고있는 것에 따라, 객체와 함께'is'보다는 클래스와 함께 isinstance를 사용하는 것이 더 좋습니다. 예를 들어, 데이터 (pickle, shelf, marshall 등)를 지속한다면,'DELETE = object()'는 프로그램의 후속 실행시에 달라지며 지속 된 데이터와 일치하지 않을 것이다. 그러나 커스텀'Delete '클래스는 여전히 작동 할 것입니다. –

1

글쎄, 간단한 대답은 할 수 없다는 것입니다. (음, 일 수 있지만 원하는 것은 아닙니다.)

여기에는 DeleteCell = object()과 같은 클래스를 사용해야합니다 (또는 CellAction 클래스 또는 그 안에 다양한 작업 (다른 클래스)이있는 모듈이있을 수 있음).