Постоянный выбор ничего не делая

Это кажется ошибкой с CamelCasePropertyNamesContractResolver . Его базовый класс DefaultContractResolver имеет два конструктора: конструктор без параметров и версию DefaultContractResolver (Boolean) (только что устаревшие в Json. NET 7.0). Этот параметр имеет следующее значение:

shareCache

  • Тип: System.Boolean Если установлено значение true, DefaultContractResolver будет использовать кешированный общий доступ с другими преобразователями тот же тип. Совместное использование кеша значительно улучшит производительность с помощью нескольких экземпляров resolver, потому что дорогое отражение произойдет только один раз. Этот параметр может вызвать неожиданное поведение, если разные экземпляры резольвера предполагают получение разных результатов. Если установлено значение false, настоятельно рекомендуется повторно использовать экземпляры DefaultContractResolver с помощью JsonSerializer.

По умолчанию false.

К сожалению, конструктор по умолчанию для CamelCasePropertyNamesContractResolver устанавливает значение в true:

public class CamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    public CamelCasePropertyNamesContractResolver()
#pragma warning disable 612,618
        : base(true)
#pragma warning restore 612,618
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }
}

Кроме того, нет второго конструктора с shareCache. Это нарушает ваш SpecificFieldsResolver.

В качестве обходного пути вы можете получить свой резольвер из DefaultContractResolver и использовать CamelCaseNamingStrategy для отображения имени:

public class IndependentCamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    public IndependentCamelCasePropertyNamesContractResolver()
        : base()
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }    
}

public class SpecificFieldsResolver : IndependentCamelCasePropertyNamesContractResolver
{
    // Remainder unchanged
}

Обратите внимание, что если вы используете версию Json.NET до 9.0, CamelCaseNamingStrategy не существует. Вместо этого вложенное kludge CamelCasePropertyNamesContractResolver можно использовать для сопоставления имен:

public class IndependentCamelCasePropertyNamesContractResolver : DefaultContractResolver
{
    class CamelCaseNameMapper : CamelCasePropertyNamesContractResolver
    {
        // Purely to make the protected method public.
        public string ToCamelCase(string propertyName)
        {
            return ResolvePropertyName(propertyName);
        }
    }
    readonly CamelCaseNameMapper nameMapper = new CamelCaseNameMapper();

    protected override string ResolvePropertyName(string propertyName)
    {
        return nameMapper.ToCamelCase(propertyName);
    }
}

0
задан martineau 2 March 2019 в 09:30
поделиться

2 ответа

Вы не проверяете результат после того, как игрок решил встать. Поскольку вы только deal() один раз до цикла while True, вы просто получите бесконечное условие, если вы решите стоять несколько раз. Подсчитайте счет после того, как дилер забрал все свои карты.

def hit_stand(deck, player, dealer, hand, stand):
    print("What would you like to do")
    print("[1] - Hit\n[2] - Stand")
    choice = input("> ")
    hand = False
    if choice == '1':
        player.append(deck.pop())
    elif choice == '2':
        stand = True
        while score(dealer) <= 16:
            print(score(dealer))
            dealer.append(deck.pop())
        display_info(player, dealer, stand)
        results(player, dealer, first_hand, stand) # HERE

На несколько не связанной ноте вылет из игры после определения окончательного счета не очень элегантен. Вы захотите взглянуть на лучшую конструкцию, чем while True: и sys.exit(), чтобы контролировать поток, но это упражнение для вас.

Наконец, вы не должны использовать sum в качестве имени переменной внутри score(), потому что это встроенная функция, которую вы переопределяете. Используйте что-то вроде total, чтобы не рисковать маскированием самой встроенной функции.

0
ответ дан roganjosh 2 March 2019 в 09:30
поделиться

Ответ от @roganjosh правильный, но я хотел добавить еще одну заметку, потому что я думаю, что это действительно важный момент о том, как работает Python. Это то, что люди, пришедшие из C / C ++ / Java (то есть почти все мы), должны не учиться при использовании Python.

Как я уже говорил в комментариях выше, в исходном коде от Марии Лауры, похоже, что вызов hit_stand предназначен для использования некоторых переменных (таких как stand) в качестве выходных переменных, а в Python мы не можем иметь «выходные переменные» в вызове функции. Но Мария Лаура упомянула, что «удар работает хорошо», что означает, что параметр player изменялся. Итак, , если мы не можем иметь «выходные переменные», то почему значение player модифицируется функцией hit_stand?

Когда код вызывает hit_stand, пять объекты передаются в функцию:

  • Объект списка, которому присваивается имя deck,
  • Объект списка, которому присваивается имя player, [ 1132]
  • Объект списка, которому присваивается имя dealer,
  • Логический объект, которому присваивается имя hand,
  • Логический объект, которому присваивается the name stand

Код вне этой функции также имеет имена (deck, player, dealer, first_hand, standing), указывающие на эти же пять объектов. В коде hit_stand метод .append() вызывается для объектов списков player и dealer, а метод .pop() вызывается для объекта deck, поэтому все эти объекты мутируют. Имена из вызывающей области все еще указывают на те же самые объекты, поэтому эти имена теперь будут видеть эти изменения.

История для hand и stand отличается. Внутри функции hit_stand hand и stand назначаются новые значения с помощью оператора =. Как отмечалось в , это превосходное описание Фредрика Лунда , оператор = в Python не «изменяет» переменную, он просто берет объект и связывает его с именем. Сами объекты не изменились, скорее они были заменены новыми булевыми объектами. Таким образом, переменная standing во внешней области все еще указывает на свой исходный логический объект, а переменная stand в функции указывает на совершенно новый логический объект, отличный от того, который находится во внешней области. Мы ничего не можем сделать с переменными hand и stand, которые будут видны во внешней области, не может быть такой вещи, как «передача по ссылке» или «выходной параметр», как у нас в других языках. [1140 ]

Эта концепция поначалу может показаться очень чуждой, пока мы не изучим то, что узнали в нашем обучении C / C ++ / Java.

0
ответ дан Mr. Snrub 2 March 2019 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: