[英]In python how can I use/manipulate an object defined in a script from a function defined in an imported module?
這可能是一個非常簡單的答案,但我不知道“正確”的答案是什么。 假設我有一個腳本
import utils
bar = 1
utils.foo()
print bar
此外,模塊utils
是:
def foo():
bar = bar+1
如上所述,顯然,我得到:
UnboundLocalError: local variable 'bar' referenced before assignment
如何在foo()
使用bar
? 在我的特定情況下,我並不是真的想要更改foo
,但是我確實需要能夠在foo()
使用它及其狀態。
一種解決方法是將bar
傳遞給foo()
:
def foo(bar):
return bar+1
並替換腳本中的第三行: bar = utils.foo(bar)
。
但是,這感覺很麻煩。 特別是如果bar是一個復雜的對象。
我對上述案例的最佳實踐方法感興趣。
您為什么不想更改foo? 如果導入模塊,則要使用其功能。 如果foo函數沒有參數,則在模塊utils本身中使用bar或其他變量。 如果要使用功能值不在模塊內部的函數,則:
def foo(bar):
return bar+1
是完全可以接受的。
編輯://創建類foo1時,只需在構造函數中設置bar。 類foo1:def init (self,bar):self.bar = bar
圖片這種情況:
import someModule
# now you want to use a function of this module
foo()
也許然后會出現類似以下錯誤:未定義bar或任何->模塊未松耦合。 根據您的建議使用參數使函數foo(完全可以接受),或者通過構造函數或setBar方法設置bar值。
我對上述案例的最佳實踐方法感興趣
正如您所描述的, bar
是foo
的參數,將參數傳遞給函數的最佳實踐是將其作為參數傳遞給函數。
在utils.py
:
def foo(bar):
return bar+1
在您的其他腳本中:
import utils
bar = 1
bar = utils.foo(bar)
print bar
這是最佳做法。 它遵循正確的語義。 這也是可測試的:
import unittest
import utils
class MyTest(unittest.TestCase):
def setUp(self):
self.bar = 1
def test_bar(self):
self.assertEquals(2, utils.foo(self.bar))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.