
YAPF (Yet Another Python Formatter) - Detailed Review
Coding Tools

YAPF (Yet Another Python Formatter) - Product Overview
Introduction to YAPF (Yet Another Python Formatter)
YAPF, or Yet Another Python Formatter, is a tool developed to streamline and standardize the formatting of Python code. Here’s a brief overview of its primary function, target audience, and key features.Primary Function
YAPF is a Python formatter that calculates the best formatting for your code based on a configured style. It aims to produce code that is as readable and well-formatted as if a programmer had written it while following a style guide. This tool is particularly useful for maintaining consistency in code formatting across large projects or teams.Target Audience
YAPF is intended for developers and test engineers who use the Python language. It is especially beneficial for teams working on large-scale Python projects where consistent code formatting is crucial for readability and maintainability.Key Features
Installation
YAPF can be installed via PyPI using the command `pip install yapf`. For the latest developments, you can also clone the repository from GitHub or install directly from there.Configurable Formatting Style
YAPF allows you to configure the formatting style using various options. You can specify styles on the command line or use configuration files such as `.style.yapf`, `setup.cfg`, `pyproject.toml`, or a file in your home directory. Predefined styles include `pep8` (default) and `yapf` (for Google open source projects).Command-Line Options
YAPF offers several command-line options to customize its behavior. These include `–in-place` for modifying files directly, `–recursive` for formatting entire directories, `–diff` to show the differences, and `–style` to specify the formatting style. You can also exclude certain files using patterns and format specific lines within a file.Integration with Editors
YAPF supports integration with multiple editors through community extensions or plugins, making it easy to use within your favorite development environment.Algorithm
YAPF’s formatting algorithm works by creating a weighted tree to determine the best formatting decisions. It processes code one logical line at a time, ensuring that the formatted code is as good as what a programmer would write manually. In summary, YAPF is a powerful tool for Python developers to ensure consistent and readable code formatting, making it an essential addition to any Python development workflow.
YAPF (Yet Another Python Formatter) - User Interface and Experience
User Interface and Experience
The user interface and experience of YAPF (Yet Another Python Formatter) are designed to be straightforward and user-friendly, particularly for developers familiar with command-line tools and configuration files.Installation and Basic Usage
YAPF is easily installed via PyPI using the command `pip install yapf`. Once installed, you can run YAPF on one or multiple files using simple commands. For example, to format a file in-place, you would use `yapf -i filename.py`.Configuration
One of the key features of YAPF is its configurability. Users can customize the formatting rules according to their preferences. This can be done through various configuration files such as `.style.yapf`, `setup.cfg`, or `pyproject.toml`. These files allow you to specify style settings, such as indent width, spacing before comments, and more.Custom Style Example
For instance, you can define a custom style based on one of the predefined styles (e.g., `pep8`, `google`, `yapf`) and modify specific settings. Here’s an example of how you might configure it in a `.style.yapf` file: “`plaintext based_on_style = pep8 indent_width = 2 spaces_before_comment = 4 split_before_logical_operator = true “` This flexibility makes it easy for teams to enforce a consistent coding style across their projects.Command-Line Options
YAPF provides a range of command-line options that make it easy to use. You can specify the formatting style, exclude certain files, run the formatter recursively over directories, and more. For example, the `–style` argument allows you to specify a formatting style, and the `–diff` option prints the diff for the fixed source code.Output Readability
Both the formatted code output and the error messages are designed to be readable. YAPF aims to produce code that is as good as what a programmer would write if they were following the style guide. However, it’s worth noting that while YAPF’s output is generally readable, it may sometimes be less readable than Black’s due to the strictness of Black’s formatting rules.Ease of Use
YAPF is relatively easy to use, especially for developers who are comfortable with command-line tools. The documentation provides clear examples of how to use the formatter and how to configure it. However, some users have noted that the documentation could be improved, particularly in explaining the differences between the various built-in styles and the effects of different configuration settings.Overall User Experience
The overall user experience with YAPF is positive, especially for teams looking to enforce a consistent coding style. It automates the formatting process, reducing the time spent on code reviews and ensuring that the codebase remains clean and consistent. While it may be slightly slower than Black due to its more complex algorithm, it is still relatively fast and efficient.Summary
In summary, YAPF offers a user-friendly interface with a focus on configurability and ease of use, making it a valuable tool for maintaining clean and consistent Python codebases.
YAPF (Yet Another Python Formatter) - Key Features and Functionality
Yet Another Python Formatter (YAPF)
YAPF is a powerful tool for formatting Python code, and it offers several key features and functionalities that make it invaluable for developers.Installation and Usage
YAPF can be installed using `pip` with the command `pip install yapf`. For those who need to install it for all users, reinstalling `pip` might be necessary to avoid issues. To use YAPF, you can run it from the command line or integrate it into your favorite editor or IDE. Here is an example of how to format all Python files in a directory with 4-space indentation: “`bash yapf –in-place –recursive –style=”{indent_width: 4}” *.py “` This command formats the files in place, recursively goes through the directory and its subdirectories, and applies the specified style.Formatting Style Configuration
YAPF allows you to configure the formatting style extensively. You can specify the style using the `–style` argument, either by naming a predefined style (e.g., `pep8` or `google`) or by providing a custom style configuration. Custom styles can be defined in a `.style.yapf` file, `setup.cfg`, `pyproject.toml`, or even directly on the command line using a dictionary format. For example: “`bash yapf –style='{based_on_style: pep8, indent_width: 2}’ “` This command uses the `pep8` base style but modifies it to have two-space indentations.File and Directory Handling
YAPF can handle files and directories in various ways:- In-place formatting: The `–in-place` option allows YAPF to make changes directly to the files.
- Recursive formatting: The `–recursive` option enables YAPF to format files in subdirectories.
- Excluding files: You can exclude files from formatting using patterns specified in a `.yapfignore` file or the `pyproject.toml` file.
Command Line Options
YAPF provides several command-line options to customize its behavior:- Diff output: The `–diff` option shows the differences between the original and formatted code.
- Quiet mode: The `–quiet` option suppresses output and sets the return value.
- Parallel processing: The `–parallel` option allows YAPF to format multiple files in parallel.
- Line range: The `–lines` option specifies a range of lines to reformat within a file.
Integration with Editors and IDEs
YAPF is supported by multiple editors and IDEs through community extensions or plugins, making it easy to integrate into your development workflow.Algorithm and Formatting
YAPF uses an algorithm based on `clang-format` to determine the best formatting for the code. It works on `LogicalLine` objects, which are lists of `FormatToken`s that should be placed on a single line if possible. The algorithm creates a weighted tree to find the optimal formatting solution, ensuring that the formatted code adheres to the specified style guidelines.AI and Algorithmic Integration
While YAPF does not explicitly use AI in the traditional sense, its formatting algorithm is highly sophisticated and designed to make optimal formatting decisions. This algorithm, derived from `clang-format`, uses a weighted tree approach to determine the best formatting, which can be seen as a form of advanced computational logic rather than AI per se.Benefits
- Consistency: YAPF helps maintain consistent coding styles across large projects and teams.
- Efficiency: It automates the formatting process, saving developers time and reducing the effort needed to maintain clean code.
- Customizability: The tool offers extensive configuration options to fit various coding standards and preferences.
- Integration: YAPF can be easily integrated into development workflows, including CI/CD pipelines, to ensure code is always formatted correctly.

YAPF (Yet Another Python Formatter) - Performance and Accuracy
Performance
YAPF’s performance is generally good, but it does have some nuances compared to other formatters. Here are a few key aspects:Speed
YAPF is relatively fast, though it is slower than some other formatters like Black. This is because YAPF uses a more complex algorithm that aims to make more significant changes to the code to achieve the best possible formatting.Resource Usage
While YAPF is efficient, its algorithm, which is based on `clang-format`, can be more resource-intensive due to the weighted tree approach it uses to determine the best formatting. However, this does not typically pose a significant issue for most users.Accuracy
YAPF is highly accurate in terms of adhering to style guides, particularly PEP 8, which is a standard for Python code.Style Compliance
YAPF is designed to produce code that is as good as what a programmer would write if they were following the style guide. It aims to maintain consistency across the codebase, which is crucial for readability and maintainability.Customization
YAPF allows for customization of formatting rules through style configurations. This means users can adjust the formatting to better suit their needs, which can improve the readability of the output code.Limitations and Areas for Improvement
Despite its strengths, YAPF has some limitations:Handling Large Data Literals
YAPF can sometimes struggle with large data literals, which may become disfigured during the formatting process. To mitigate this, users can disable YAPF for specific regions of code using comments like `# yapf: disable` and `# yapf: enable`.Manual Adjustments
In some cases, YAPF may not fully comply with PEP 8 guidelines without manual adjustments. For example, it may not split long import statements or complex expressions correctly, requiring manual intervention to ensure compliance.Edge Cases
There are edge cases where YAPF’s formatting might not be as readable as hand-formatted code. This is because the tool prioritizes adherence to the style guide over subjective readability, which can sometimes result in less-than-ideal formatting for certain code structures.Integration and Usage
YAPF is versatile and can be integrated into various development workflows:Command-Line Tool
YAPF can be used as a command-line tool, making it easy to integrate into CI/CD pipelines or as part of a developer’s workflow.Library
It can also be used as a library, allowing it to be integrated into IDEs or other development tools. For example, there is a GitHub action available that automates the formatting process using YAPF.IDE Extensions
YAPF has been integrated into some IDEs, such as Visual Studio Code, through community-contributed extensions, making it easier for developers to use within their preferred development environment. In summary, YAPF is a powerful and accurate Python formatter that excels in maintaining style consistency and readability. While it has some limitations, particularly with handling large data literals and certain edge cases, it remains a valuable tool for ensuring high-quality code formatting in Python projects.
YAPF (Yet Another Python Formatter) - Pricing and Plans
The Pricing Structure for YAPF
The pricing structure for YAPF (Yet Another Python Formatter) is straightforward and free, as it is an open-source tool and not a commercial product.
Key Points
- Free to Use: YAPF is completely free and does not have any paid tiers or plans. It is an open-source project hosted on GitHub.
- No Subscription Models: There are no subscription fees, monthly or annual charges, or any other financial obligations to use YAPF.
- Open-Source: The tool is maintained and updated by the community, and users can contribute to its development.
- Installation: Users can install YAPF using pip from PyPI or directly from the GitHub repository. It can also be run as a command-line tool without installation.
Features
- Formatting Styles: YAPF supports various formatting styles, including PEP8, Google, and Facebook styles, which can be configured through command-line options or configuration files.
- Customization: Users can customize the formatting style using configuration files or command-line arguments.
- Command-Line Options: YAPF offers several command-line options to control its behavior, such as in-place formatting, diff output, and recursive formatting of directories.
Conclusion
In summary, YAPF is a free, open-source Python formatter with no pricing tiers or plans, making it accessible to everyone without any cost.

YAPF (Yet Another Python Formatter) - Integration and Compatibility
YAPF Overview
YAPF, or Yet Another Python Formatter, integrates seamlessly with a variety of tools and platforms, making it a versatile option for maintaining consistent code formatting in Python projects.Editor Integration
YAPF is supported by several popular code editors through community extensions or plugins. Here are a few examples:IntelliJ/PyCharm
You can use the File Watchers plugin to run YAPF automatically when you save a file. This involves setting up a `watcherTasks.xml` file with the appropriate configuration.VSCode
YAPF can be integrated into VSCode using EeyoreLee’s yapf extension. You need to install the extension and configure your `settings.json` to use it as the default formatter.IPython
IPython supports YAPF for formatting code blocks automatically when you press the `CI/CD Pipelines and Pre-commit Hooks
YAPF can be integrated into Continuous Integration/Continuous Deployment (CI/CD) pipelines and pre-commit hooks, although with some differences compared to other formatters like Black:Pre-commit Hooks
While YAPF does not have an officially supported pre-commit hook, it can still be used in pre-commit hooks and CI/CD pipelines. This requires manual setup, unlike Black which has an official pre-commit hook.Build Systems and Linters
YAPF is also compatible with various build systems and linters:Pants Build System
With the release of Pants 2.7, YAPF is now supported alongside other formatters like Black, isort, and Docformatter. This allows developers to run YAPF as part of their build process using commands like `./pants fmt` and easily integrate it into their projects incrementally.Configuration and Style
One of the key features of YAPF is its configurability. You can define your formatting style using various configuration files such as `.style.yapf`, `setup.cfg`, or `pyproject.toml`. YAPF supports predefined styles like `pep8`, `google`, and `chromium`, and you can fine-tune these styles using “knobs” to customize the formatting to your needs.Cross-Platform Compatibility
YAPF is written in Python and can be run on any platform that supports Python 3.7 or later. This makes it highly portable and compatible across different operating systems, including Windows, macOS, and Linux. You can install YAPF using pip, and it can be run as a command-line tool or integrated into your favorite editor or build system.Conclusion
In summary, YAPF offers extensive integration options with various development tools, editors, and build systems, making it a flexible and adaptable choice for maintaining consistent Python code formatting across different platforms.
YAPF (Yet Another Python Formatter) - Customer Support and Resources
Installation and Usage
To get started, users can install YAPF using pip with the command pip install yapf
. For the latest developments, you can also install directly from the GitHub repository using pip install git https://github.com/google/yapf.git
.
Configuration and Customization
YAPF allows extensive customization of formatting styles. Users can specify styles using command-line arguments, or through configuration files such as .style.yapf
, setup.cfg
, or pyproject.toml
. These files can be placed in the current directory or any of its parent directories. The default style is PEP8 if no configuration file is found.
Editor Integration
YAPF supports integration with various editors, including Visual Studio Code (VSCode) and Wing Python IDE. For VSCode, you can install the eeyore.yapf
extension and configure it to format Python files on save or on cell execution for notebooks. In Wing Python IDE, YAPF is invoked using python -m yapf
and must be configured using YAPF’s own configuration system.
Documentation and Guides
The official YAPF repository on GitHub provides comprehensive documentation, including usage examples, configuration options, and FAQs. This documentation covers how to use YAPF as a command-line tool, as a library, and how to exclude files from formatting using .yapfignore
or pyproject.toml
files.
Community Support
Users can engage with the YAPF community through issues and discussions on the GitHub repository. This is a good place to report bugs, request features, and get help from other users and the maintainers of the project.
Additional Resources
- Style Configuration: Detailed information on configuring YAPF styles, including predefined styles like
pep8
andyapf
, and how to customize these styles using various knobs. - FAQs: The repository includes a section on frequently asked questions, which addresses common issues such as why YAPF might not format code as expected and how to indicate regions that YAPF should ignore.
By leveraging these resources, users can effectively use YAPF to maintain consistent and readable code formatting in their Python projects.

YAPF (Yet Another Python Formatter) - Pros and Cons
Advantages of YAPF (Yet Another Python Formatter)
Customization
One of the significant advantages of YAPF is its ability to be highly configurable. Unlike some other formatters, YAPF allows users to customize the formatting rules according to their preferences. It comes with built-in styles such as PEP 8, Google, and Facebook, and users can fine-tune these styles using various configuration options or “knobs.”
Algorithmic Approach
YAPF uses an algorithm inspired by clang-format
, which calculates the best formatting for the code based on the configured style. This approach ensures that the formatted code is as close as possible to what a programmer would write if they were following the style guide.
Integration and Usage
YAPF can be easily integrated into CI/CD pipelines and pre-commit hooks, although the pre-commit hook is not officially supported by the YAPF team. It can also be used as a command-line tool or as a library within other applications.
Readability
YAPF focuses on producing readable code output. While it adheres to style guides, it also allows for customization that can make the output more readable, especially in cases where strict formatting rules might not be ideal.
Community and Maintenance
Although YAPF is not an official Google product, it is maintained and has an active community contributing to its development. This ensures that the tool continues to evolve and improve over time.
Disadvantages of YAPF
Speed
Compared to other formatters like Black, YAPF is generally slower. This is because YAPF’s algorithm is more complex and aims to make more significant changes to the code to achieve the best possible formatting.
Consistency Issues
While YAPF’s configurability is a strength, it can also lead to inconsistent code formatting if different configurations are used across different parts of a project. This inconsistency can be confusing, especially in large projects.
Documentation Limitations
The documentation for YAPF, particularly regarding the differences between its built-in styles and the effects of various configuration options, is sometimes scarce or unclear. This can make it harder for users to fully leverage YAPF’s capabilities.
Potential Formatting Issues
YAPF may not always produce the most readable or aesthetically pleasing code, especially for large data literals or complex code structures. Users can disable formatting for specific sections using # yapf: disable
and # yapf: enable
comments, but this requires manual intervention.
Lack of Validation Flag
Unlike Black, YAPF does not have a built-in flag to validate the formatting of the code. Users have to create custom scripts to achieve this functionality.
By considering these points, you can make an informed decision about whether YAPF is the right tool for your coding needs.

YAPF (Yet Another Python Formatter) - Comparison with Competitors
When comparing YAPF (Yet Another Python Formatter) with other code formatting tools in the Python ecosystem
Several key aspects and alternatives come into focus.
Configuration and Customization
YAPF stands out for its configurability. It allows users to customize the formatting rules according to their preferences, which can be specified in a configuration file such as `.style.yapf`, `setup.cfg`, or `pyproject.toml`. This flexibility is a significant advantage for teams or projects with specific formatting guidelines.
In contrast, Black, another popular Python formatter, is highly opinionated and enforces a strict set of non-configurable formatting rules. While this ensures consistency across projects, it may be too restrictive for some users.
Speed and Performance
Black is known for its speed, formatting code quickly due to its simple algorithm that makes minimal changes to the code. YAPF, while still relatively fast, is slower than Black because its algorithm is more complex and aims to make more significant improvements to the code.
Readability and Output
Both YAPF and Black produce readable code, but the output can vary. Black’s strict rules can sometimes result in less readable code, especially for complex expressions. YAPF’s customizable rules allow for more flexibility in achieving readability that suits the project’s needs.
Integration and Usage
YAPF can be integrated into various development environments, including VSCode through a formatter extension, which supports formatting Python files and Jupyter notebook cells.
Black, on the other hand, is widely supported in many IDEs and CI/CD pipelines due to its simplicity and strict adherence to a uniform style. It also has a simpler installation process, often just requiring `pip install black`.
Algorithm and Approach
YAPF uses a weighted tree algorithm to determine the best formatting for the code, considering various formatting decisions and their associated costs. This approach allows for more nuanced formatting but can be slower and more complex.
In contrast, Black uses a simpler algorithm focused on making minimal changes to achieve consistent formatting, which contributes to its speed but limits its flexibility.
Alternatives and AI-Driven Tools
For those looking for AI-driven code formatting solutions, tools like the AI-Driven Code Formatter (which uses the Black library under the hood) might be of interest. This tool leverages machine learning to format and optimize code, although it relies on Black’s formatting rules and does not offer the same level of customization as YAPF.
Another option is the Code Formatter powered by AI, which can format code in various languages, including Python, and adheres to standards like PEP 8. However, this tool is more generalized and may not offer the same level of integration or customization as YAPF or Black.
Conclusion
YAPF is a strong choice for teams or projects that require customizable formatting rules and are willing to invest time in configuring these rules. For those who prefer a more straightforward, opinionated approach with high speed and simplicity, Black might be the better option. When considering AI-driven solutions, the choice depends on whether you need language-agnostic formatting or deep integration with Python-specific tools.

YAPF (Yet Another Python Formatter) - Frequently Asked Questions
Here are some frequently asked questions about YAPF (Yet Another Python Formatter) along with detailed responses:
Why does YAPF destroy my awesome formatting?
YAPF is designed to format code according to a specified style guide, but it may not always match the readability or aesthetics of hand-formatted code. For large data literals or complex code structures, YAPF might produce less readable results. To mitigate this, you can use comments to disable YAPF formatting for specific sections of code: “`python # yapf: disable FOO = { # … some very large, complex data literal. } # yapf: enable “` This way, you can preserve the formatting of critical sections.Why Not Improve Existing Tools?
YAPF was created to utilize the powerful reformatting algorithm from `clang-format`, which is different from the goals and algorithms of existing formatting tools. Using `clang-format` allows YAPF to produce high-quality formatting that might not be achievable with extensive modifications to other tools.Can I Use YAPF In My Program?
Yes, YAPF is designed to be used both as a command-line tool and as a library. You can integrate YAPF into your tools or IDE plugins to leverage its formatting capabilities. The main APIs for calling YAPF are `FormatCode` and `FormatFile`, which allow you to reformat code strings or files with various configuration options.I still get non-PEP8 compliant code. Why?
YAPF aims to be fully PEP 8 compliant but prioritizes not altering the semantics of your code. In some cases, it may not split long lines or add parentheses to maintain safety. These issues can usually be fixed manually by adding parentheses or adjusting the code slightly.How Do I Configure the Formatting Style?
YAPF allows you to configure the formatting style in several ways. You can specify the style on the command line using the `–style` argument, or use configuration files like `.style.yapf`, `setup.cfg`, or `pyproject.toml`. These files can be placed in the current directory or any of its parent directories. If no configuration file is found, YAPF defaults to the PEP8 style.How Can I Use YAPF with My IDE?
To use YAPF with an IDE like PyCharm, you need to install YAPF using `pip`, ensure a `.style.yapf` file exists in your codebase’s root folder, and then set up YAPF as an external tool and file watcher in PyCharm. This will apply YAPF formatting automatically when you save files.What If YAPF Does Not Format Certain Lines Correctly?
YAPF works on `LogicalLine` objects, which can sometimes lead to less-than-ideal formatting for certain lines. You can specify specific line ranges to format using the `–lines` option, which can help in formatting snippets of code rather than entire files. Additionally, you can use comments to disable formatting for specific sections of code.How Does YAPF’s Algorithm Work?
YAPF’s formatting algorithm uses a weighted tree to determine the best formatting. Each node in the tree represents a formatting decision, and the algorithm chooses the path with the lowest cost. This approach ensures that YAPF produces formatting that adheres to the configured style while minimizing the number of formatting decisions that need to be made.Can I Use YAPF with Other Development Tools?
Yes, YAPF can be integrated with various development tools and environments. For example, there are extensions available for VSCode that support YAPF formatting for Python files and Jupyter notebook cells. You can also use YAPF with other beautification tools like Unibeautify by configuring the YAPF executable path.
YAPF (Yet Another Python Formatter) - Conclusion and Recommendation
Final Assessment of YAPF (Yet Another Python Formatter)
YAPF is a versatile and powerful Python formatter that can significantly simplify the process of maintaining clean and consistent code. Here’s a detailed assessment of who would benefit from using YAPF and an overall recommendation.Benefits and Features
- Customizability: YAPF stands out for its configurability. Users can customize the formatting rules according to their preferences or project standards. This is achieved through configuration files such as `.style.yapf`, `setup.cfg`, or `pyproject.toml`, allowing for a high degree of flexibility.
- Performance Optimization: YAPF not only formats code to make it look better but also optimizes it for performance. It reorganizes and restructures the code to improve its overall efficiency.
- Integration: YAPF makes it easy to integrate code written by multiple developers into a single project. It ensures that the code adheres to a uniform style, which is crucial for large projects and collaborative environments.
- Algorithmic Approach: YAPF uses a sophisticated algorithm based on `clang-format` that calculates the best formatting for the code. This approach ensures that the formatted code is as good as what a programmer would write following a style guide.
Who Would Benefit Most
- Large Project Teams: Teams working on large projects with multiple contributors will greatly benefit from YAPF. It helps maintain a consistent coding style across the entire project, reducing the time spent on code reviews and ensuring that the codebase remains uniform.
- Developers with Specific Style Preferences: Developers who have specific formatting preferences or need to adhere to particular coding standards (e.g., Google, PEP8) can customize YAPF to meet their needs. This flexibility makes YAPF a valuable tool for projects with unique style requirements.
- Automated CI/CD Pipelines: YAPF can be integrated into Continuous Integration/Continuous Deployment (CI/CD) pipelines to ensure that all code checked into the repository follows the same formatting rules. This helps in maintaining code quality and consistency automatically.
Speed and Readability
- Speed: While YAPF is not as fast as some other formatters like Black, it is still relatively fast and efficient. However, its more complex algorithm means it may take a bit longer to format code compared to simpler formatters.
- Readability: YAPF produces highly readable code output. The ability to customize formatting rules allows users to optimize the readability of the code according to their preferences, which can sometimes make YAPF’s output more readable than that of more rigid formatters like Black.
Recommendation
YAPF is an excellent choice for anyone looking for a flexible and powerful Python code formatter. Here are some key points to consider:- Use YAPF if you need customization: If your project requires specific formatting rules or if you prefer a certain coding style, YAPF’s configurability makes it an ideal choice.
- Consider YAPF for large projects: For large projects or collaborative environments, YAPF’s ability to maintain uniform coding styles is invaluable.
- Evaluate against other formatters: If speed is a critical factor, you might want to compare YAPF with other formatters like Black. However, if customization and readability are more important, YAPF is a strong contender.