HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > PHP
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 30.09.2009, 23:09
rushter
Reservists Of Antichat - Level 6
Регистрация: 23.05.2008
Сообщений: 756
Провел на форуме:
9257858

Репутация: 979


Отправить сообщение для rushter с помощью ICQ
По умолчанию

есть фаил config.py
Цитата:
num = 1
есть фаил def.py
Цитата:
def ret():
global num
return num+1
есть фаил main.py
Цитата:
from config import *
from def import *
print ret()
Цитата:
NameError: global name 'num' is not defined
Как открыть доступ к переменной num из функции ret() ?
__________________
Blog

Последний раз редактировалось rushter; 30.09.2009 в 23:35..
 
Ответить с цитированием

  #2  
Старый 01.10.2009, 01:23
E-AL
Познающий
Регистрация: 03.10.2007
Сообщений: 37
Провел на форуме:
259133

Репутация: 68
По умолчанию

rushter
глобальные имена должны объявляться, если им будут присваиваться значения внутри функции...
def ret():
global num
num = 0
return num+1

вот это уже работает.. и еще лучше не называть модуль зарезервированным словом, ибо мы получаем ошибку при from def import * (хотя, если это просто сокращенный пример, то все ок).
 
Ответить с цитированием

  #3  
Старый 01.10.2009, 09:47
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Честно говря, никогда не встречал таких конструкций, если бы мне нужно было в какой -нибудь моей функции в составе какого либо модуля получить достпу к какой-либо переменной то я делал бы приблизительно так :
Код:
class def_:
    def __init__(self):
        self.num = 0
    def ret(self):
        return self.num
а потом уже делал бы как-то так :
Код:
import config
import def #это если ты все таки решишь назвать его def.py, а класс def_ положишь в него
def_ = def.def_()
def_.num = config.num
Конструкция ненамного сложнее, зато позволяет избавиться от некошерного global.
P.S. Исходя из имен файла, то я бы посоветовал поглядеть в сторону ConfigParser ....

Последний раз редактировалось login999; 01.10.2009 в 09:51..
 
Ответить с цитированием

  #4  
Старый 01.10.2009, 11:46
rushter
Reservists Of Antichat - Level 6
Регистрация: 23.05.2008
Сообщений: 756
Провел на форуме:
9257858

Репутация: 979


Отправить сообщение для rushter с помощью ICQ
По умолчанию

Цитата:
Сообщение от login999  
Честно говря, никогда не встречал таких конструкций, если бы мне нужно было в какой -нибудь моей функции в составе какого либо модуля получить достпу к какой-либо переменной то я делал бы приблизительно так :
Код:
class def_:
    def __init__(self):
        self.num = 0
    def ret(self):
        return self.num
а потом уже делал бы как-то так :
Код:
import config
import def #это если ты все таки решишь назвать его def.py, а класс def_ положишь в него
def_ = def.def_()
def_.num = config.num
Конструкция ненамного сложнее, зато позволяет избавиться от некошерного global.
P.S. Исходя из имен файла, то я бы посоветовал поглядеть в сторону ConfigParser ....
Как я понял в твоём примере num определяется в классе,а не в config.Желательно чтобы функция работала с config.num и не принимала никаких параметров.
__________________
Blog
 
Ответить с цитированием

  #5  
Старый 01.10.2009, 12:32
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Ладно, можно сделать и наоборот
Код:
class def_:
    def __init__(self):
        self.config = None
    def ret(self):
        return self.config.num
Вызов потом сделать так :
Код:
import config
import def #это если ты все таки решишь назвать его def.py, а класс def_ положишь в него
def_ = def.def_()
def_.config = config
print def_.ret()
Просто немного поопираться на то что это обьекты, да и все станет попроще.
Либо на крайняк можно реализовать взаимодействие классов через какие-либо свои приколы, если честно, то просто нужно глянуть код и посмотреть, чего там можно переделать. Модульность то предполагает собой классы как таковые , просто дай второму классу хэндлер на первый, и пущай он там себе обрабатывает его
 
Ответить с цитированием

  #6  
Старый 01.10.2009, 17:03
rushter
Reservists Of Antichat - Level 6
Регистрация: 23.05.2008
Сообщений: 756
Провел на форуме:
9257858

Репутация: 979


Отправить сообщение для rushter с помощью ICQ
По умолчанию

Цитата:
Сообщение от login999  
Ладно, можно сделать и наоборот
Код:
class def_:
    def __init__(self):
        self.config = None
    def ret(self):
        return self.config.num
Вызов потом сделать так :
Код:
import config
import def #это если ты все таки решишь назвать его def.py, а класс def_ положишь в него
def_ = def.def_()
def_.config = config
print def_.ret()
Просто немного поопираться на то что это обьекты, да и все станет попроще.
Либо на крайняк можно реализовать взаимодействие классов через какие-либо свои приколы, если честно, то просто нужно глянуть код и посмотреть, чего там можно переделать. Модульность то предполагает собой классы как таковые , просто дай второму классу хэндлер на первый, и пущай он там себе обрабатывает его
Сделал как ты написал:
Цитата:
AttributeError: 'module' object has no attribute 'keys'
__________________
Blog

Последний раз редактировалось rushter; 01.10.2009 в 17:08..
 
Ответить с цитированием

  #7  
Старый 01.10.2009, 17:19
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Можно код в ПМ ?
Просто как я показал, то я таким образом сам увязываю, когда начинаю косить под ООП и у мну получается несколько standalone классов, проблем в принципе никогда не было...
P.S. Подозреваю, что ты неправильно его привязал.
P.P.S. Если у тебя есть аттрибут keys это вообще очень некошерно.

Последний раз редактировалось login999; 01.10.2009 в 17:22..
 
Ответить с цитированием

  #8  
Старый 01.10.2009, 17:24
rushter
Reservists Of Antichat - Level 6
Регистрация: 23.05.2008
Сообщений: 756
Провел на форуме:
9257858

Репутация: 979


Отправить сообщение для rushter с помощью ICQ
По умолчанию

ладно,пойду другим способом.Как импортировать модуль из папки которая на уровень ниже ?
__________________
Blog
 
Ответить с цитированием

  #9  
Старый 01.10.2009, 17:30
login999
Постоянный
Регистрация: 12.06.2008
Сообщений: 654
Провел на форуме:
4512757

Репутация: 973


По умолчанию

Код:
import os
import sys

level_down_dir = u"configs"

dir_path = os.getcwdu()+os.sep+level_down_dir+os.sep
dir_path = current_dir.encode(sys.getfilesystemencoding())
sys.path.append(dir_path)
А дальше пох..

Или, как вариант можно юзать __import__(), но я точно не помню как он работает
 
Ответить с цитированием

  #10  
Старый 03.10.2009, 19:16
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

str.replace(old, new[, count])
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ