Hướng dẫn python global variable not defined at the module level - biến toàn cục của python không được xác định ở cấp mô-đun

.

Tôi nghĩ rằng tôi thực sự hiểu biết về việc Python làm như thế nào do nền C#/C ++ của tôi. Vì vậy, đây là những gì tôi đang cố gắng làm ngay lúc này.

Tôi bắt đầu với hai mô-đun để thiết lập phần còn lại của dự án của mình, một phần dưới dạng kiểm tra tỉnh táo và chứng minh khái niệm. Một mô -đun ghi lại mọi thứ vào một tệp khi tôi đi trong khi cũng lưu trữ dữ liệu từ nhiều mô -đun (để cuối cùng đóng gói tất cả và bỏ chúng theo yêu cầu) thực hiện tất cả những điều này trong Pycharm và đề cập đến các cảnh báo lỗi mà nó gợi ý bằng cách này và sử dụng Python 2.7

Module 1:
  src\helpers\logHelpers.py
    class LogHelpers:
      class log:
         def classEnter():
           #doing stuff
         def __init__(self):
           self.myLog = LogHelpers.log()  #forgot to mention this was here initially
      [..] various logging functions and variables to summarize what's happening
    __builtin__.mylogger = LogHelpers

Module 2:
  src\ULTs\myULTs.py
    mylogger.myLog.classEnter()

(Cả hai mô -đun và SRC gốc \ đều có tệp init.py trống trong chúng)init.py file in them)

Vì vậy, theo phản hồi hoàn toàn tuyệt vời ở đây (Python - khả năng hiển thị của các biến toàn cầu trong các mô -đun nhập khẩu) ở giai đoạn này, điều này sẽ hoạt động, nhưng 'Mylogger' trở thành 'tham chiếu chưa được giải quyết' '

Vì vậy, đó là một cách tiếp cận. Tôi cũng đã thử một cái toàn cầu thẳng hơn (Python: Cách tạo biến mô-đun chéo?)

Module 1:
  src\helpers\logHelpers.py
    class LogHelpers:
      class log:
         def classEnter(self):
           #doing stuff
         def __init__(self):
           self.myLog = LogHelpers.log()  #forgot to mention this was here initially
      [..] various logging functions and variables to summarize what's happening
    mylogger = LogHelpers

  __init__.py
     __all__ = ['LogHelpers', hexlogger]
    from .logHelpers import * 

Module 2:
  src\ULTs\myULTs.py
    from helpers import mylogger
    mylogger.myLog.classEnter()

Phiên bản này nhận được lỗi "không được thông báo" "trong tập thể, mà các báo cáo khác nhau dường như chỉ ra có nghĩa là Mylogger không được khởi tạo (mã lỗi sai nhưng đó có vẻ là ý nghĩa của nó)

Và sau đó tôi đã thử cái này ..

Module 1:
  src\helpers\logHelpers.py
    class LogHelpers:
      class log:
         def classEnter(self):
           #doing stuff
         def __init__(self):
           self.myLog = LogHelpers.log()  #forgot to mention this was here initially
      [..] various logging functions and variables to summarize what's happening
    __mylogger = LogHelpers

  __init__.py
     __all__ = ['LogHelpers', hexlogger]
    from .logHelpers import * 

Module 2:
  src\ULTs\myULTs.py
    from helpers import mylogger

    def someFunction(self):
      global mylogger
      mylogger.myLog.classEnter()

Và phiên bản này nhận được 'biến toàn cầu không được xác định ở mức độ mô -đun' khi tôi di chuột của Mylogger toàn cầu.

Sau đó, có ý tưởng về mô -đun khác theo dõi ví dụ của chính nó về một lớp, nếu cuối cùng tôi phải thực hiện phương pháp đó và điều phối chúng .. nhưng đó là một vụ hack khi xem xét những gì tôi đang cố gắng làm.

Đó là loại nơi tôi đang ở, đó là ý chính của những gì tôi đang cố gắng làm ... Tôi đang đọc qua nhiều câu hỏi tương tự như tôi có thể nhưng tất cả chúng dường như trở lại với những giải pháp này (mà Dường như không hoạt động) hoặc nói 'Đừng làm điều đó' (nói chung là lời khuyên tốt nhưng tôi không thực sự theo cách của Pythony ưa thích đẩy tất cả chúng vào một thư mục)

Suy nghĩ? .

.

class testClass:
    def __init__(self):
        self.testVar = 2
    def incrementVar(self):
        self.testVar += 1
myClass = testClass()

Đặt nó qua init.pyinit.py

__all__ = [myClass]
from .logHelpers import myClass

Đã đi đến mô -đun khác và

from helpers import myClass
class Test_LogHelpers(unittest.TestCase):
    def test_mini(self):
        myClass.incrementVar()

Chạy nó trực tiếp thay vì nhìn vào Pycharm, không có gì toàn cầu .. NameError: name 'myClass is not defined

Vì vậy, vẫn ở hình vuông một :( (và vẫn cần lưu trữ trạng thái)

[Chỉnh sửa] Thêm Traceback:

Traceback (most recent call last):
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 3.4.1\helpers\pycharm\utrunner.py", line 124, in     module = loadSource(a[0])
  File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 3.4.1\helpers\pycharm\utrunner.py", line 40, in loadSource    module = imp.load_source(moduleName, fileName)
  File "C:\[...mylocation...]\py\src\ULTs\LogHelpers_ULT.py", line 3, in     from helpers import myClass
  File "C:\[...mylocation...]\py\src\helpers\__init__.py", line 7, in 
    __all__ = [myClass]
NameError: name 'myClass' is not defined

================================================== ===========================

KK, tôi đã làm cho nó làm việc với miniclass. Tôi không biết tại sao phương pháp / cách tiếp cận khác không hoạt động, nhưng điều này dường như sửa chữa mọi thứ. .

**logHelpers.py**
[... some static logging functionality ...]

class testClass:
    def __init__(self):
        self.testVar = 2

    def incrementVar(self, source):
        self.testVar += 1
        mylogger.myLog.info(source + " called, new val: " + str(self.testVar))
myClass = testClass()

**test_LogHelpers_ULT.py**
import unittest

from helpers.logHelpers import myClass    

class Test_LogHelpers(unittest.TestCase):
    def test_mini(self):
        myClass.incrementVar("LogHelpers")

Vì một số lý do, bỏ qua init.py (và để trống) và đi cho nhập khẩu rõ ràng hoạt động. Nó cũng duy trì trạng thái - Tôi đã tạo một bản sao của tệp kiểm tra và đầu ra nhật ký của tôi có '3' để tệp đầu tiên gọi trình trợ giúp và '4' để tệp thứ hai gọi người trợ giúp.init.py (and leaving it blank) and going for the explicit importation worked. It also maintained state - I created a duplicate of the test file and my log output correctly had '3' for the first file to call the helper, and '4' for the second file to call the helper.

Cảm ơn Daniel Roseman vì sự giúp đỡ và đề xuất, họ đã cho tôi nhìn thêm một chút theo đúng hướng. Nếu bạn có thể nhận ra lý do tại sao những thứ trước đó không hoạt động, nó sẽ được đánh giá cao chỉ để thêm vào sự hiểu biết của tôi về ngôn ngữ này, nhưng tôi sẽ tiếp tục và đánh dấu câu trả lời của bạn là 'trả lời' vì nó có một số phản hồi rất hữu ích.

Làm thế nào để bạn xác định một biến toàn cầu ở cấp độ mô -đun trong Python?

Làm thế nào để tạo một biến toàn cầu..
Tạo một mô -đun toàn cầu. #Global.py current_value = 0 ..
Tạo một tệp chương trình Python để truy cập biến toàn cầu. #Updater.py Nhập toàn cầu def update_value (): Global.Current_Value = 100 ..
Tạo một chương trình Python khác để kiểm tra giá trị có được thay đổi hay không ..

Tại sao biến toàn cầu của tôi không được xác định?

Lý do cảnh báo đầu tiên không được xác định là vì bạn đã khai báo lại toàn cầu như một biến cục bộ bên dưới nó trong hàm.Và trong JavaScript có nghĩa là từ đầu hàm, nó được coi là biến cục bộ.Một bên dưới nó hoạt động bởi vì ngay trên cảnh báo bạn đã cho nó một giá trị.you re-declared global as a local variable below it in the function. And in javascript that means from the top of the function it is considered the local variable. The one below it works because just above the alert you gave it a value.

Các biến toàn cầu nên được xác định ở đâu trong Python?

Một biến toàn cầu trong Python thường được tuyên bố là đỉnh của chương trình.Nói cách khác, các biến được khai báo bên ngoài hàm được gọi là biến toàn cầu.Bạn có thể truy cập các biến toàn cầu trong Python cả bên trong và bên ngoài hàm.as the top of the program. In other words, variables that are declared outside of a function are known as global variables. You can access global variables in Python both inside and outside the function.

Làm thế nào để bạn cập nhật một biến toàn cầu trong Python?

Sử dụng từ khóa toàn cầu † để sửa đổi biến toàn cầu bên trong một hàm.Nếu chức năng của bạn có một biến cục bộ có cùng tên với biến toàn cầu và bạn muốn sửa đổi chức năng biến toàn cầu bên trong thì hãy sử dụng từ khóa 'toàn cầu' trước tên biến khi bắt đầu chức năng, tức là.. If your function has a local variable with same name as global variable and you want to modify the global variable inside function then use 'global' keyword before the variable name at start of function i.e.