2016-06-12 88 views
0

比方說,我有這樣的事情:是否有可能使一串代碼像一個模塊一樣起作用?

source_string = """ 
class someClass: 
    def __init__(self): 
     self.s = "some String" 
    def _return_s(self): 
     return self.s 

""" 

我可以把這個字符串轉換成模塊狀物體?爲了幫助你更好地理解:

SomeClassModule = _import(source_string) 
print(SomeClassModule.someClass()._return_s()) 

如果這是可能我的目標是使使用URL導入系統。

+1

您可以執行任意Python源代碼字符串,請參閱http://stackoverflow.com/q/701802/3001761 – jonrsharpe

+0

這看起來像'eval()'將用於,但'eval'是邪惡的 –

+0

eval是沒有用於複雜的代碼,exec是 – lejlot

回答

0

使用exec,您可以按照已經指出的那樣執行此操作。試試看:

>>> source_string = """ 
... class someClass: 
... def __init__(self): 
...  self.s = "some String" 
... def _return_s(self): 
...  return self.s 
... 
... """ 
>>> exec(source_string) 
>>> dir() 
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'ask', 'random', 'someClass', 'source_string', 'var'] 
>>> x = someClass() 
>>> x 
<__main__.someClass object at 0x7f131424a1d0> 
>>> dir(x) 
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_return_s', 's'] 
>>> x.s 
'some String' 
>>> x._return_s() 
'some String' 

我不明白你爲什麼要這樣做。爲什麼你不能正常定義類?

+0

我知道我可以使用exec,但它並沒有做我所需要的,我可以讓它做我需要的,但這有點hacky。我需要一些能夠像導入一樣返回代碼字符串的東西。但我認爲這是不可能的。我想這樣做的原因是因爲我想通過url導入內容。例如,'module = _import(「http://example.com/modules/mod.py」)' – user3103366

+0

哦,我想我明白了。 –

+0

您應該創建一個包含所有其他類的類,然後將其返回。 – Sasszem

相關問題