2012-07-09 3 views
1

가져올 필요가있는 파일의 목록이 많습니다. 나는 오직 그들 중 오직 하나만 필요로 할 것이고 그들은 모두 같은 인터페이스를가집니다. (지불 처리를위한 지불 게이트웨이 선택)변수 "interpolation"을 사용하여 import 문을 만듭니다.

모든 게이트웨이 파일의 이름을 나타내는 사전이 있다고 가정하십시오. 즉

gateways = { 
    '1' : 'authorize', 
    '2' : 'paysimple', 
    '3' : 'braintreepayments', 
    '4' : 'etc', 
} 

나는 데이터베이스의 정보를 기반으로이 사전에 키를 알고있다. 그래서 게이트웨이 값 1로 지불 프로세스 요청을 받으면 Authorize.net에서 처리해야한다는 것을 알고 있습니다. 2는 Pay Simple으로 처리됩니다. 기타

elif 문장의 끔찍한 목록이 아니라 내가 아는 정보로 작성된 가져 오기 문을 만들 수 있기를 원합니다.

아래의 간단한 방법을 고려 gogo 실제로 수입에 import 문을 야기 할 수있는 방법이다

# For the purposes of this example assume payment_gateway is defined 
# elsewhere and represents the key to the dictionary 
gateway_file = gateways.get(payment_gateway) 

import_str = "from gateway_interface.%s import process" % gateway_file 
gogo(import_str) 

.

그런 것이 가능합니까?

+2

당신의 프로세스는 오직 하나의 지불만을 처리하고 종료합니까? 특이하게 들립니다. –

+0

나는 그게 특이한 방법인지 모르겠습니다. 온라인 쇼핑을하고 체크 아웃을 요청하는 경우 왜 둘 이상의 게이 트웨이로 트랜잭션을 처리합니까? – Rico

+0

한 번에 하나씩 만 사용하지만 일반적으로 온라인 쇼핑은 수명이 다한 많은 요청을 처리하는 장기 실행 프로세스에서 처리됩니다. –

답변

5

간단한

process = __import__('gateway_interface.'+gateway_file,fromlist=['foo']).process 

편집 다음 fromlist의 '푸'한 fromlist는 빈리스트 아니므로, 무엇이든 할 수있다. 그 이상한 부분은 Why does Python's __import__ require fromlist?에 설명되어 있습니다.

__import__Python's __import__ doesn't work as expected에 설명 된대로 예상대로 작동하지 않기 때문에 편집해야했습니다.

당신은 파이썬 2.7

import importlib 
process = importlib.import_module('gateway_interface.'+gateway_file).process 

가 waaaay를 멋진 그들이 이상한 패키지에없는 경우에도 올바른 기능을 찾는 당신에게 해결책을 줄 수 package_tools (예 : from pkg_resources import iter_entry_points)

을 사용하는 것입니다 경우 gateway_interface 아래에. 그들이 모두 한 곳에 있고 너는 잔인한 점을 필요로하지 않는다면 ... 그래 단지 ... __import__

+0

이것은 나를 위해 잘 작동하지 않으며, 내가 뭘 잘못했는지 확신하지 못합니다. 다음 오류가 나타납니다. '모듈'객체에 'process'속성이 없습니다. – Rico

+0

두 가지 방법 중 어느 것을 시도했는지 확실하지 않으므로 테스트 할 것입니다. gateway_file 하위 디렉토리에'__init __. py '가 있습니까? –

+0

모든 것이 같은 모듈'gateway_interface '안에 있습니다. 가져올 파일에는 인스턴스화해야하는'process' 클래스가 있습니다. 네,'gateway_interface'는'__init __. py'를 가지고 있습니다. – Rico

2

import 문 내부 나 __import__ 메서드 자체에 액세스 할 수있는 imp 모듈을 살펴보십시오.이 중 하나를 사용하면 내가 생각하는 바를 달성 할 수 있습니다.

1

내장 매크로 __import__ 방법은 작동합니다 :

process = __import__(gateways.get(payment_gateway)).process