Я не могу не понять, что делаю все неправильно (снова Python)

Все вопросы, которые я недавно задавал о Python, относятся к этому проекту. Я понял, что причина, по которой я задаю так много вопросов, может быть не в том, что я новичок в Python (но я знаю немало PHP), и, вероятно, не в том, что Python имеет какой-то врожденный недостаток.

Таким образом, я сейчас скажу, что это за проект и какова моя текущая идея, и вы можете сказать мне, что я все делаю неправильно, что мне нужно изучить несколько вещей, или что Python просто не подходит для работы с этим типом. проекта и языка XYZ было бы лучше в этом случае или даже если есть какой-то проект с открытым исходным кодом, в котором я, возможно, захочу принять участие.

Проект
Я запускаю бесплатную пошаговую стратегическую игру (подумайте о режиме кампании из серии Total War, но с еще большей сложностью и глубиной) и создаю для нее боевой симулятор (опять же, подумайте о total war как о том, как это будет работать) . Я ни в коей мере не заблуждаюсь, чтобы думать, что когда-нибудь сделаю что-нибудь такое же хорошее, как одни только игры Total War, но я действительно думаю, что могу автоматизировать процесс, который я сейчас делаю вручную.

Что это будет делать
Он должен будет учитывать широкий диапазон переменных для юнитов, оборудования, тренировок, погоды, местности и так далее и так далее. Я понимаю, что это большая задача, и планирую заниматься ею по частям в свободное время. У меня нулевой бюджет, но это хобби, на которое я готов (и уже сделал).

Мой нынешний камень преткновения
В PHP все может получить доступ ко всему остальному, «неправильно», хотя некоторые могут посчитать, что это действительно очень удобно. Если у меня есть набор оборудования для использования подразделениями, я могу получить его откуда угодно. С Python мне приходится переделывать этот массив каждый раз, когда я импортирую соответствующий файл данных, и это кажется довольно глупым решением для языка, который, по моему опыту, хорошо продуман. Я ввел систему регистрации вызовов функций и создания классов (потому что я знаю из очень простой версии этого, которую я однажды сделал в PHP, что это очень поможет в будущем) и способ, которым я сохранил данные в одном месте - передать каждому из моих классов экземпляр в мой список журналов, для меня это пахнет взломом, но это единственный способ заставить его работать.

Таким образом, я прихожу к выводу, что мне чего-то не хватает, и был бы очень признателен за понимание любого, кто готов это дать. Спасибо.

Примеры кода

Это создает список образований, пока есть только одно значение (помимо имени), но я ожидаю добавления дополнительных, поэтому они являются списком классов, а не просто стандартным списком. Это находится в data.py

formations = []
formationsHash = []
def createFormations(logger):
    """This creates all the formations that will be used"""

    # Standard close quarter formation, maximum number of people per square metre
    formationsHash.append('Tight')
    formations.append(Formation(logger, 'Tight', tightness = 1))

    # Standard ranged combat formation, good people per square metre but not too cramped
    formationsHash.append('Loose')
    formations.append(Formation(logger, 'Loose', tightness = 0.5))

    # Standard skirmishing formation, very good for moving around terrain and avoiding missile fire
    formationsHash.append('Skirmish')
    formations.append(Formation(logger, 'Skirmish', tightness = 0.1))

    # Very unflexible but good for charges
    formationsHash.append('Arrowhead')
    formations.append(Formation(logger, 'Arrowhead', tightness = 1))


def getFormation(searchFor):
    """Returns the fomation object with this name"""
    indexValue = formationsHash.index(searchFor)
    return formations[indexValue]

У меня нет образца кода, когда мне нужно было бы получить к нему доступ, потому что я еще не дошел до его создания, но я ожидаю, что код будет выглядеть примерно так:

Python
tempFormation = data.getFormation(unit.formationType)
tempTerrain = data.getTerrain(unit.currentTerrain)
unit.attackDamage = unit.attackDamage * tempTerrain.tighnessBonus(tempFormation.tightness)

Единица содержит целое число, которое связано с индексом / ключом соответствующей местности, формации и еще много чего в главном списке. Временные переменные используются, чтобы сделать 3-ю строку короче, но в долгосрочной перспективе могут возникнуть проблемы, если я забуду ее получить и будет использовать значение из более раннего, которое тогда неверно (здесь может пригодиться регистрация).

PHP
$unit->attackDamage *= $terrain[$unit->currentTerrain]->tighnessBonus($unit->currentTerrain)

Класс юнитов содержит индекс (возможно, строку) соответствующей местности, на которой он находится, и формации, в которой он находится.

Возможно, это покажет серьезный недостаток в моем понимании Python (6 месяцев против 3 лет PHP).

«Мне нужно переделывать этот массив каждый раз, когда я импортирую соответствующий файл данных» Фрагмент почтового кода, пожалуйста.

S.Lott 01.01.2009 19:39

data.py создает массив (ну, список), чтобы использовать этот список из другого файла, мне нужно импортировать data.py и переделать указанный список.

Teifion 01.01.2009 19:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
443
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я сузил вашу проблему до:

With Python I have to remake that array each time I import the relevant data file

На самом деле у вас есть два варианта, первый и самый простой - сохранить структуру в памяти. Таким образом (как и в случае с PHP) вы можете теоретически получить к нему доступ «откуда угодно», вы немного ограничены пространством имен, но это для вашего же блага. Это переводится как «куда угодно».

Второй вариант - иметь некоторую абстракцию данных (например, базу данных или файл данных, как у вас), которая хранит, и вы извлекаете из нее данные. Это может быть лучше, чем первый вариант, поскольку у вас может быть слишком много данных для одновременного размещения в памяти. Опять же, способ получения этих данных будет доступен «где угодно», как и PHP.

Вы можете либо передать эти вещи напрямую экземплярам явным образом, либо вы можете использовать глобальные переменные на уровне модуля и импортировать их в места, где они вам нужны, по мере того, как вы говорите:

and the way that I've kept the data in one place is to pass each of my classes an instance to my logging list

Могу вас уверить, что это не взлом. Это вполне разумно, в зависимости от использования, например, объект конфигурации может использоваться таким же образом, поскольку вы можете захотеть протестировать свое приложение с одновременным использованием разных конфигураций. Ведение журнала может быть лучше подходит для глобального уровня модуля, который просто импортируется и вызывается, поскольку вам, вероятно, когда-либо понадобится только один способ ведения журнала, но опять же, это зависит от ваших требований.

Подводя итог, вы действительно на правильном пути. Постарайтесь не поддаваться этому «хакерскому» запаху, особенно при использовании языков, с которыми вы не совсем знакомы. Взлом одного языка может стать золотым стандартом для другого. И, конечно же, желаю удачи в вашем проекте - звучит весело.

Спасибо за положительные комментарии :)

Teifion 01.01.2009 19:45

@Ali A: «сохранить структуру в памяти». Я думаю, что это можно сделать так: «data.py должен реализовывать синглтон. Все остальные классы могут и должны иметь доступ к единственному экземпляру этого класса». Я ошибаюсь, говоря это? Вы имели в виду что-то еще, например, в памяти sqllite db или что-то в этом роде?

JV. 01.01.2009 20:28

With Python I have to remake that array each time I import the relevant data file

Здесь вы упускаете тонкий момент семантики Python. Когда вы импортируете модуль во второй раз, вы не выполняете повторно код в этом модуле. Имя находится в списке всех импортированных модулей, и вам возвращается тот же модуль. Итак, во второй раз, когда вы импортируете свой модуль, вы получите ссылку на тот же список (в Python не говорите array, скажем list).

Вам, вероятно, потребуется опубликовать конкретные образцы кода, чтобы получить дополнительную помощь, похоже, что здесь есть несколько заблуждений Python, и как только они будут прояснены, вам будет проще.

Пожалуйста, не изобретайте велосипед. Ваш formationsHash как список значений ключей бесполезен и дублирует функции словаря.

def createFormations(logger):
    """This creates all the formations that will be used"""
    formations = {}
    formations['Tight']= Formation(logger, 'Tight', tightness = 1)
    formations['Loose']= Formation(logger, 'Loose', tightness = 0.5)
    formations['Skirmish']= Formation(logger, 'Skirmish', tightness = 0.1)
    formations['Arrowhead']= Formation(logger, 'Arrowhead', tightness = 1)
    return formations

Обратите внимание: на самом деле вам не нужен getFormation, потому что он вам не поможет. Вы можете просто использовать что-то вроде этого.

formations = createFormations( whatever )
f= formations[name]

Я подумал, что список будет лучшей идеей, теперь я снова думаю об этом, я не уверен, почему я так подумал.

Teifion 01.01.2009 22:51

Это сокращает объем кода и ускоряет поиск. Лучше во всех отношениях.

recursive 02.01.2009 00:44
Ответ принят как подходящий

«data.py создает массив (ну, список), чтобы использовать этот список из другого файла, мне нужно импортировать data.py и переделать указанный список».

Я не могу понять, о чем вы говорите. Шутки в сторону.

Вот основная программа, которая импортирует данные, и еще один модуль.

SomeMainProgram.py

import data
import someOtherModule

print data.formations['Arrowhead']
someOtherModule.function()

someOtherModule.py

import data
def function():
    print data.formations['Tight']

data.py

import theLoggerThing
class Formation( object ):
    pass # details omitted.
def createFormations( logger ):
    pass # details omitted
formations= createFormations( theLoggerThing.logger )

Итак, основная программа работает так.

  1. import data. Модуль data импортирован.

    а. import theLoggerThing. Что бы это ни было.

    б. class Formation( object ):. Создайте класс Formations.

    c. def createFormations( logger ):. Создайте функцию createFormations.

    d. formations =. Создайте объект formations.

  2. import someOtherModule. someOtherModule импортирован.

    а. import data. Ничего не произошло. data уже доступен по всему миру. Это ссылка на то, что фактически является Синглтон. Все модули Python - Синглтоны.

    б. def function. Создайте функцию function.

  3. print data.formations['Arrowhead']. Оцените data.formations, объект словаря. Сделайте get('Arrowhead') в словаре, который выполняет магический поиск и возвращает найденный там объект (экземпляр Formation).

  4. someOtherModule.function().

    Что происходит во время этой оценки функции.

    а. print data.formations['Tight']. Оцените data.formations, объект словаря. Сделайте get('Tight') в словаре, который выполняет магический поиск и возвращает найденный там объект (экземпляр Formation).

Это был синглтон, которого я не понимал. Я думал, что импорт со второго места создаст отдельный объект, а не ссылку на оригинал.

Teifion 01.01.2009 23:29
python.org/doc/2.5.2/ref/import.html - «найти модуль, при необходимости инициализировать». Определение того, как работает импорт, содержит множество полезных деталей.
S.Lott 02.01.2009 00:17

Другие вопросы по теме