簡體   English   中英

在python中,如何從導入模塊中定義的函數中使用/操作腳本中定義的對象?

[英]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值。

我對上述案例的最佳實踐方法感興趣

正如您所描述的, barfoo的參數,將參數傳遞給函數的最佳實踐是將其作為參數傳遞給函數。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM