2013-02-06 3 views
3

매개 변수화하려는 모듈이 있거나 객체에서 함수를 가져 오려고합니다.파이썬의 파라 메트릭 모듈? 객체에서 함수 가져 오기

나는 그것으로부터 물건을 가져 오기 전에 그것의 행동을 변화시킬 인자를주고 싶다.

한 가지 방법은 내 모듈을 객체로 만들고 그 기능을 사용하는 것입니다. 현재이 작업을 수행합니다.

class MyModule(object): 
    def __init__(self, previous_sayings): 
     self.sayings = previous_sayings 
    __all__ = ['sayhi'] 
    def sayhi(self): 
     self.sayings.append("hi!") 

mod = MyModule(["oh no!"]) 
sayhi = mod.sayhi 
sayhi() 
sayhi() 
print mod.sayings 

이렇게하면 ["oh no!", "hi!", "hi!"]이 출력됩니다.

그러나이 기능을 사용하면 더 많은 기능을 사용할 수 있습니다.

나는 이런 식으로 뭔가를 할 수 있도록하고 싶습니다 :

mod = MyModule(["oh no!"]) 
from mod import * 
sayhi() 
sayhi() 

print mod.sayings 

이 가능한 같은 것도 있습니까? 기본 모듈에서 상속받을 수 있습니까? 어쨌든 사용자에게 분명히 보여야하는 제약 조건을 추가하면 어떻습니까?

+1

. 자신의 네임 스페이스에 인스턴스 메서드를 가질 수있는 기능을 원한다는 것입니까? –

+0

개체가 실제로 모듈인지 클래스인지는 신경 쓰지 않습니다. 적절한 함수와 값을 로컬 네임 스페이스에 쉽게 가져 와서 전달한 인수에 계속 액세스 할 수있게하려고합니다. 말이 돼? –

+0

@JohnSalvatier : sayhi = mod.sayhi()와 정확히 무슨 문제가 있습니까? 이것은 꽤 일반적인 파이썬 관용구입니다 (특히'lambda x : s.find (x)'또는'functools.partial (str.find, s)'대신's.find'를 전달하는 것과 같은 코드를 포함한다면) while 클래스 인스턴스처럼 동작하는 모듈을 만드는 것은 매우 당연한 일입니다. – abarnert

답변

2

모듈에 대한 실현하기 위해 몇 가지가 있습니다

  • 그들은 당신이 오직 상관없이

  • 당신을 가져올 얼마나 많은 장소, 그 중 하나가 없습니다 즉, 싱글 톤 인수를 전달할 수 없습니다

  • from <module> import *은 위험하지 좋은 습관이며, 해당 방법

  • 디자인 된 모듈과 함께 사용되어야한다
  • 모듈에 정의 된 모든 함수, 클래스 등은 항상 해당 모듈을 전역 이름 공간으로 간주합니다.

당신은 당신이 원하는 비슷한 뭔가를 얻을 수 있습니다 :

8<--mod.py------------------------------------------------------ 
sayings = [] 
def sayhi(): 
    sayings.append("Hi!") 
8<-------------------------------------------------------------- 

import mod 
mod.sayings = ['oh no!'] # or mod.sayings.append('oh no') 
from mod import sayhi 
sayhi() 
sayhi() 
print mod.sayings 
+1

+1. 그러나 (모든주의 사항을 읽은 후에)'mod import * '를 수행한다면, 정말로'mod.py'에서'__all__'을 사용하여 가져 오는 것을 제한하려고합니다. (이 경우에는'__all__ = [ 'sayhi']'가 될 것입니다.) – abarnert

0

유일한 문제가 있다는 것입니다 경우

sayhi=mod.sayhi() 
saybye=mod.saybye() 
# … 40 more functions 

더 자세한보다는 :

from mod import sayhi, saybye, # … 40 more functions 

더 좋은 해결책은 아마 수입 p를하는 것이다. rogrammatically :

for name in mod.__all__: 
    locals[name] = getattr(mod, name) 

또는 : 클래스를 사용하는 것보다 더 좋을 거라 모듈을 사용하는 이유는 나에게 분명하지 않다

locals.update({name: getattr(mod, name) for name in mod.__all__}) 
+0

그리고 누군가는 "왜 mod import *에서하지 않았을까요?"라고 물어볼 것입니다. ;) –

+0

@EthanFurman :'mod '가 클래스 인 경우, 파이썬을 아는 사람은 아무도 그것을 묻지 않을 것입니다. "mod는 모듈이 아니기 때문에 Foo 클래스의 잠재적 인 인스턴스 중 하나 인 객체입니다. 객체에서 가져올 수 없습니다. 다음은 매뉴얼에 대한 링크입니다." (객체 이름을 'mod'로하면 더 혼란 스럽지만, 원래 게시물에 있습니다.)'mod '가 실제로 객체가 될 자격이없고 모듈이어야한다면, 그렇습니다.이 해결책은 어리석은 짓입니다. 그러나 OP가 하나의 객체를 원하지 않는 유일한 이유는 "이 기능이 많을수록 잘 작동하지 않을 것"입니다. – abarnert

관련 문제