Hướng dẫn python global variable is undefined at the module level - Biến toàn cục 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.

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.

Làm thế nào để bạn tuyên bố một biến toàn cầu trong Python?

Thông thường, khi bạn tạo một biến bên trong một hàm, biến đó là cục bộ và chỉ có thể được sử dụng bên trong hàm đó.Để tạo một biến toàn cầu bên trong một hàm, bạn có thể sử dụng từ khóa toàn cầu.use the global keyword.

Một biến không xác định trong Python là gì?

Một biến không xác định trong mã nguồn của chương trình máy tính là một biến được truy cập trong mã nhưng chưa được mã đó khai báo.Trong một số ngôn ngữ lập trình, một tuyên bố ngầm được cung cấp lần đầu tiên một biến như vậy gặp phải tại thời điểm biên dịch.a variable that is accessed in the code but has not been declared by that code. In some programming languages, an implicit declaration is provided the first time such a variable is encountered at compile time.

Bạn có cần phải tuyên bố biến toàn cầu trong Python không?

Để tạo một biến toàn cầu trong Python, bạn cần khai báo biến bên ngoài hàm hoặc trong phạm vi toàn cầu.you need to declare the variable outside the function or in a global scope.

Bài Viết Liên Quan

Chủ Đề