편집 : 좋아, 나는 거의 그것을 알아 냈다. (내가 원한 것은 100 %는 아니지만, 여전히 작동한다.) 그것은 execfile()
기능입니다, 나는 그곳에 몰랐다는 것을 믿을 수 없습니다.전역 변수를 선언하는 함수 가져 오기
나는이 문구를 어떻게 표현할 지 잘 모르겠다. (이것이 나의 구글 검색이 사실상 아무 것도 나타나지 않는 이유이다.) 그러나 여기에 간다. 내가하려는 일의 단순화 된 버전을 제공 할 것입니다. 두 파일, main.py
및 extra.py
이 있다고 가정 해 보겠습니다. 내가 콘솔에서이 작업을 실행하면
# extra.py
def setfoo(): # sets "foo" to 5 even if it is unassigned
global foo
foo = 5
그래서 매우 간단합니다 :
>>> setfoo()
>>> foo
5
은 이제
main.py
까지 머리를 뒤로하자 후자는 다음과 같이 보인다. 나는
extra.py
에서 모든 가져 오기 문을 설정할 수 있습니다 :
# main.py
from extra import *
setfoo()
print foo
모든 것이 마지막 줄까지 잘 작동을; 그러나 main.py
이 foo
에 액세스하려고하면 foo
이 실제로 파일 extra.py
에 저장되므로 인식하지 못합니다. setfoo()
을 실행 한 후에 모든 항목을 다시 가져 오면 foo
을 가져오고 모든 것이 올바르게 작동합니다. 그래서 같이 : 나는 from...import
문 대신 표준 import
문을 사용하는 경우 또는
# main.py
from extra import *
setfoo()
from extra import *
print foo
, extra.py
의 데이터에 직접 액세스하는 것이 아니라 복사되고 있기 때문에, 모든 것을 다시 가져와야 할 필요가 없다.
# main.py
import extra
extra.setfoo()
print extra.foo
그러나, 나는 정말 extra.setfoo()
에게 내가 setfoo()
을 실행 할 때마다를 입력 할 필요가 싶지 않아,도 내가 extra.py
에게 내가 말한 기능을 사용할 때마다 다시 가져올 싶어 : 그래서 이것은 또한 작동합니다. 이 문제에 대한 해결 방법이 있는지 알고 싶습니다. 이상적으로는 원래 코드 main.py
에서 설정 한 코드가 올바르게 작동하도록 extra.py
을 수정하는 방법이 있습니다. (EDIT : 여러 사람이 이것을 잘못 해석 한 것 같습니다. extra.py
을 수정하려고합니다.이 코드를 가져 오려면 맨 위의 import 문을 변경하지 않고 main.py
을 변경하고 싶지 않습니다.) 또한 다른 방법을 사용하여 가져 오는 extra.py
(나는 PHP의 include
및 require
문과 비슷한 것으로 생각합니다. 가져온 코드는 말 그대로 복사되어 파일에 붙여 넣어집니다.) 이 수정 된 import 문은 여전히 한 줄의 코드 일 뿐이지 그리 오래 걸리지는 않습니다. 즉, 파일 처리와 함께 exec
문을 사용하면 아마도이 목적에 매우 편리하지 않을 것입니다.
exec 문에 대해 말하면, 내가 사용하는 코딩 방법이 얼마나 나쁜지는별로 신경 쓰지 않습니다. 이 extra.py
파일의 실제 버전이 지금부터 내 프로젝트 전부에서 사용할 계획이므로이 작업을 수행하는 방법이 필요합니다. 추가 공간을 많이 차지하지 않으려 고합니다. 이 파일을 가져올 때마다 내 코드. 어떤 도움을 주시면 감사하겠습니다.
편집 :이 글을 읽는 많은 사람들이 내가 성취하려고하는 것에 대해 정확히 명확하지 않으므로 여기에 내 코드의 실제 버전이 나와 있습니다. 그것은 "인라인 변수 할당"을 달성하기 위해 함께 사용한 구문 해킹입니다.
class use_obj(object):
def __rshift__(self, other): return other
def use(**kwargs):
for var in kwargs: exec 'global ' + var + '; ' + var + ' = kwargs[var]'
return use_obj()
구문은 다음과 같습니다 : 여기에 (다른 파일로 가져올하지 않는 경우 잘 작동) 코드입니다
print use(x = 5, y = 8) >> str(x) + " times " + str(y) + " equals " + str(x*y)
코드 자체는 꽤 총 되나 필자는 인라인 if 문, list comprehensions, lambdas + reduce()
등의 큰 팬이므로 인라인 변수 할당을 수행하는 방법을 항상 원했습니다. 왜냐하면 단순히 함수를 반환 할 수없는 이유는 할당 된 변수를 반환하는 것이기 때문입니다. use(x = 5, y = 8)
이상한 객체를 반환하는 표현식 (문이 아닌)입니다. 그런 다음을 사용하여 코드에 밀어 넣습니다. 0 연산자와 함수를 설정하는 방식으로 인해 use()
함수가 마술처럼 반환 된 이상한 객체가 사라집니다.
나는 그것을 같이한다면 코드가 아름다움과 새로움을 많이 잃을 것이라고 생각 :
print use(x = 5, y = 8) >> str(extras.x) + " times " + str(extras.y) + " equals " + str(extras.x*extras.y)
'extra.py'를 초기화하는 동안 당신은'foo'을 설정하지 않는 어떤 이유가 있습니까? 그렇지 않으면 가능한 해결책은'foo = None'을 설정하는 것입니다. –
내가 말했던 것처럼, 이것은 내가 실제로하려고하는 것의 지나치게 단순화 된 버전이다. 함수의 실제 버전은'foo'를 설정하는 방식으로 여러 변수를 설정합니다. 어떤 변수를 설정할지 알 수있는 방법이 없습니다. 그래서 창 밖입니다. –