2013-08-14 7 views
0

Python 2.6을 사용하여 다양한 형식의 테이블 (xls, csv, shp, json, xml, html 테이블 데이터)을 처리하고 해당 내용을 ArcGIS 데이터베이스 테이블에 제공하려고합니다. (나와 함께있어주세요, 이것은 GIS 부분보다 프로세스의 파이썬 부분에 관한 것입니다). 현재 디자인에서 기본 클래스는 대상 데이터베이스 테이블을 형식화하고 소스 형식의 내용으로 채 웁니다. 서브 클래스는 현재 기본 형식이 원본 형식과 상관없이 내용을 처리 할 수 ​​있도록 사전에 내용을 공급하도록 설계되었습니다.하위 클래스를 기반으로 동작 결정

문제는 내 사용자가 스크립트에 이러한 형식 중 하나의 파일이나 테이블을 제공 할 수 있으므로 런타임시 하위 클래스가 최적으로 결정된다는 것입니다. 나는 정말로 관련된 if-elif-elif -... 블록을 실행하는 것 이외의 다른 방법을 모른다. 구조는 가지 다음과 같습니다 오리 타이핑 및 다형성의

class Input: 
    def __init__(self, name): # name is the filename, including path 
    self.name = name 
    self.ext = name[3:] 
    d = {} # content goes here 
    ... # dictionary content written to database table here 

# each subclass writes to d 
class xls(Input): 
    ... 

class xml(Input): 
    ... 

class csv(Input): 
    ... 

x = Input("c:\foo.xls") 
y = Input("c:\bar.xml") 

내가 알기로이 그것에 대해 이동하는 방법이 아니다 제안,하지만 난 더 나은 디자인을 알아내는 힘든 시간을 보내고 있습니다. 앞 부분에 대한 도움말이 도움이 될 것입니다. 그러나 실제로 후자는 x.ext 또는 y.ext을 하위 클래스 (따라서 입력 처리)가 결정되는 포크로 변환하는 방법입니다.

도움이된다면, 이제 foo.xlsbar.xml 같은 데이터가 있다고 가정하자, 그래서 x.dy.d 결국 같은 {'name':'Somegrad', 'lat':52.91025, 'lon':47.88267}과 같은 항목을해야합니다.

+0

에 오신 것을 환영합니다! 질문, 답변 및 의견에 대한 마크 업 가능성을 자세히 설명하는 [markdown help pages] (http://stackoverflow.com/editing-help)를 확인하십시오. – collapsar

답변

1

이 문제는 일반적으로 하위 클래스를 알고있는 팩토리 함수로 해결됩니다. 입력 정의 할 때 서브 클래스가 정의되어 있지 않기 때문에

input_implementations = { 'xls':xls, 'xml':xml, 'csv':csv } 

def input_factory(filename): 
    ext = os.path.splitext(filename)[1][1:].lower() 
    impl = input_implementations.get(ext, None) 
    if impl is None: 
     print 'rain fire from the skies' 
    else: 
     return impl(filename) 

그것의 열심히는 기본 클래스 자체 (입력 ('file.xyz'))에서 할 수 있습니다. 까다로울 수는 있지만 단순한 공장은 쉽습니다.

+1

이 좋은 패턴에 대한 약간의 설명은 @tdelaney가 사전 구조 (input_implementations)를 구현 데이터베이스로 사용한다는 것입니다. 대안으로 모든 클래스가 모듈에 있으면'inspect.get_members()'또는 다른 메소드를 모듈에서 사용하여이 목록을 동적으로 생성 할 수 있습니다. 다른 스레드 : http://stackoverflow.com/questions/1796180/python-get-list-of-all-classes-within-current-module – Roland

0

각 파생 클래스에 구문 분석 할 수있는 가능한 파일 확장명 목록이 포함되어 있다면 어떻습니까? 그런 다음 입력 파일의 확장자를이 중 하나와 일치시켜 사용할 서브 클래스를 결정할 수 있습니다.

0

당신은 올바른 길을 가고 있습니다. 적절한 데이터 형식을 구문 분석에 대한 각각의 서브 클래스에

x = xls("c:\foo.xls") 
y = xml("c:\bar.xml") 

쓰기 방법을, 그리고 데이터베이스에 데이터를 작성하는 기본 클래스 (입력)를 사용하여 서브 클래스를 사용합니다.

+0

그건 사실입니다. 제 청중이 코딩을하지 않게하고 싶습니다. 이론적으로는 폼과 같은 GUI를 사용하는 것입니다. 여기서 입력해야하는 유일한 필드는 파일 이름과 경로입니다. – foszter

관련 문제